2023年6月8日分の特別講義の内容に、コメント(メモ)と、練習問題の解答例を加えたものです。

地図の部分などは、コードが(間違いではないのですが)不適切で、(手元のPCでは実行可能でしたが)Posit Cloud では実行不可能になっていましたから、修正しました。他にも、分布のところで、集計データ(Aggregates)が含まれてしまっていたので、それも、修正しました。修正したところには、修正しました と書いておきましたので、その部分だけ、コピー・ペーストすれば、実行可能だと思います。

火曜日の分は、もう少し、修正するかもしれません。あまり、先先に進まず、丁寧に説明できればと願っています。

1 はじめに

1.1 データサイエンス?

データから情報を得るときには、大体次のような手順をとります。

  1. 準備 Setup
  2. データを取得 Import data
  3. データ構造の確認 View data
  4. 必要に応じて整形 Transform data
  5. 視覚化 Visualize data
  6. データを理解 Understand data
  7. レポートなどにまとめる Communicate data

問いをもちデータを取得し、視覚化などを通して、データを理解し、さらに問いを深めるサイクルが、データサイエンスの核だと思います。

R を使った分析の一つの例を、見て行きます。一つ一つのコード(コンピュータ・プログラム)の簡単な説明は、加えますが、あまりそれに捉われず、データサイエンスとは何かを考えながら、雰囲気を味わってください。

1.2 R のパッケージを活用

1.2.1 準備 Setup

世界銀行(World Bank)の、世界開発指標(WDI: World Development Indicators)の一つの、GDP(Gross Domestic Product 国内総生産)のデータから始めます。GDP にも何種類かの尺度がありますが、次のものを見てみます。

  • NY.GDP.MKTP.CD: GDP (current US$)

NY.GDP.MKTP.CD は、データコードと言われるもので、世界開発指標(WDI)には、一つづつ決まっています。

World Development Indicators のサイトの下にある、Data Themes(テーマ)からテーマを選択し、下にスクロールすると、Code をみることができます。ちなみに、ここで利用する NY.GDP.MKTP.CD: GDP (current US$) は、テーマの Economy(経済)の、一番上にあります。

経済用語の英語はよく知らないという方は、ブラウザー(Edge, Google Chrome, Safari など)の翻訳機能を使うのも良いでしょう。ただ、そのページの対話型の機能(interactive function)を利用するときは、翻訳機能をOFF にする必要がある場合もありますので、注意してください。

エラーメッセージを調べるときなどに、英語のほうが情報がたくさん得られますから、言語を、英語に変更しておきます。

R には、WDI のデータを取得する R のツール(パッケージ)WDI がありますから、それを使います。また、データを取り扱うための基本的なツール(パッケージ)tidyverse を使いますので、次のコードで、これらを読み込みます。

Sys.setenv(LANG = "en")
library(tidyverse)
library(WDI)

データを保存する場所を作成しておくことをお勧めします。保存しておくときは、このディレクトリを使います。

dir.create("./data")

1.2.2 データ取得 Import data

データを取得します。少し時間がかかります。取得したデータに、df_gdp などと、わかりやすい名前をつけます。dfdata frame の略で、R で標準的なデータの形式です。

df_gdp <- WDI(country = "all", 
              indicator = c(gdp = "NY.GDP.MKTP.CD"), 
              extra = TRUE)

このコードで、全ての国の GDP を取得できます。GDP の値は、NY.GDP.MKTP.CD という名前の列にありますが、覚えやすいように、gdp という名前に変更しておきます。extra = TRUE とすることによって、それぞれの国についての情報などが追加されます。

1.2.3 データ構造の確認

最初の数行だけを見るには、head(df_dgp) とします。

head(df_gdp)

1.2.3.1 メモ

次のように、extra = TRUE を省略し、df_gdp に置き換えないで、すぐ中身を見てみると次のようになります。つまり、5列のみです。つまり、これ以外の情報が、extra ということになります。また、置き換えなくても、このように、データを見ることはできますが、これを使うときには、名前をつけておかなければいけません。それが、assignment という <- でします。= でも同じことができますが、どちらを、どちらに置き換えることを明示的にするために、矢印が推奨されています。WDI のより詳しい使い方は、火曜日に説明します。

head(WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD")))

実は、RMarkdown という文書の中であれば、次のように、head(df_gdp)ではなく、df_gdp だけでも、内容が表示され、かつ、paged という形式になっているので、10行ずつ、100 ページつまり、1000行まで、みることができます。この方が、実際に分析しているときには便利です。ただ、head は、基本ですし、下のようなものにしていると、HTML を使っている間はよいのですが、これを、PDF や、Word に変換すると、それらの形式では、機能しないので、問題が生じることもあります。「他の文書形式にもできるのか」という質問もありました。答えは、「簡単にできます。」ですが、どんなものでも、どんな形式でも出力できるかというのは、不可能です。PDF や、Word にこれらの機能がないからです。「こんなことはできますか」というのは、良い質問ですが、まずは、ここに提示しているものを、少しずつ理解していっていただければと思います。少しずつ説明します。

また、この方法は、便利ですが、これだけ、たくさんコンピュータがいつでも使えるように、覚えているため、RAM (Read Access Memory) をたくさん使ってしまうので、Posit Cloud などでは、メモリーが足りなくて文書が作成できない(Pandoc Error 137) が出る可能性があります。そこで、自分の PC で使うときは、ほとんど、考えずに、使いますが、Posit Cloud のときは、注意することにしています。

Posit Cloud を使うときには、head() を使うことをお勧めします。

df_gdp

データの構造を見るときには、str(df_gdp) もよく使われます。今度は、列が縦に並んで表示されます。

str(df_gdp)
'data.frame':   16758 obs. of  13 variables:
 $ country    : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c      : chr  "AF" "AF" "AF" "AF" ...
 $ iso3c      : chr  "AFG" "AFG" "AFG" "AFG" ...
 $ year       : int  1963 1962 1961 1960 2003 2002 2001 2000 1995 1994 ...
 $ gdp        : num  7.51e+08 5.47e+08 5.49e+08 5.38e+08 4.54e+09 ...
  ..- attr(*, "label")= chr "GDP (current US$)"
 $ status     : chr  "" "" "" "" ...
 $ lastupdated: chr  "2023-05-10" "2023-05-10" "2023-05-10" "2023-05-10" ...
 $ region     : chr  "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital    : chr  "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude  : chr  "69.1761" "69.1761" "69.1761" "69.1761" ...
 $ latitude   : chr  "34.5228" "34.5228" "34.5228" "34.5228" ...
 $ income     : chr  "Low income" "Low income" "Low income" "Low income" ...
 $ lending    : chr  "IDA" "IDA" "IDA" "IDA" ...

1.2.3.2 メモ

tidyverse Native では、str の代わりに、glimpse を使います。少し情報が多いからです。でも、この程度のものなら、ほぼ同じです。ここからわかることは、行(データの数 Number of Observations と言います)が16,758、列(変数の数 Number of Variables と言います)が 13 となります。また、chr とか、int とか dblstr では、num)とありますが、これは、文字データか、数値データか、数値の中でも、整数値か、実数値かがわかるようになっています。この違いは、とても重要です。

glimpse(df_gdp)
Rows: 16,758
Columns: 13
$ country     <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "A…
$ iso2c       <chr> "AF", "AF", "AF", "AF", "AF", "AF", "AF", "AF", "AF", "AF", "A…
$ iso3c       <chr> "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG", "AFG",…
$ year        <int> 1963, 1962, 1961, 1960, 2003, 2002, 2001, 2000, 1995, 1994, 19…
$ gdp         <dbl> 751111191, 546666678, 548888896, 537777811, 4539500884, 385423…
$ status      <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""…
$ lastupdated <chr> "2023-05-10", "2023-05-10", "2023-05-10", "2023-05-10", "2023-…
$ region      <chr> "South Asia", "South Asia", "South Asia", "South Asia", "South…
$ capital     <chr> "Kabul", "Kabul", "Kabul", "Kabul", "Kabul", "Kabul", "Kabul",…
$ longitude   <chr> "69.1761", "69.1761", "69.1761", "69.1761", "69.1761", "69.176…
$ latitude    <chr> "34.5228", "34.5228", "34.5228", "34.5228", "34.5228", "34.522…
$ income      <chr> "Low income", "Low income", "Low income", "Low income", "Low i…
$ lending     <chr> "IDA", "IDA", "IDA", "IDA", "IDA", "IDA", "IDA", "IDA", "IDA",…

概要 (summary(df_gdp)) からもある程度わかります。

summary(df_gdp) 
   country             iso2c              iso3c                year     
 Length:16758       Length:16758       Length:16758       Min.   :1960  
 Class :character   Class :character   Class :character   1st Qu.:1975  
 Mode  :character   Mode  :character   Mode  :character   Median :1991  
                                                          Mean   :1991  
                                                          3rd Qu.:2007  
                                                          Max.   :2022  
                                                                        
      gdp               status          lastupdated           region         
 Min.   :8.824e+06   Length:16758       Length:16758       Length:16758      
 1st Qu.:2.442e+09   Class :character   Class :character   Class :character  
 Median :1.784e+10   Mode  :character   Mode  :character   Mode  :character  
 Mean   :1.161e+12                                                           
 3rd Qu.:2.156e+11                                                           
 Max.   :9.653e+13                                                           
 NA's   :3602                                                                
   capital           longitude           latitude            income         
 Length:16758       Length:16758       Length:16758       Length:16758      
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
   lending         
 Length:16758      
 Class :character  
 Mode  :character  
                   
                   
                   
                   

1.2.3.3 メモ

年(year)は、1960 から 2022 であることなどがわかりますね。

国のリストをみてみましょう。とても長いリストの中には、地域名も含まれています。

df_gdp %>% distinct(country) %>% pull()
  [1] "Afghanistan"                                         
  [2] "Africa Eastern and Southern"                         
  [3] "Africa Western and Central"                          
  [4] "Albania"                                             
  [5] "Algeria"                                             
  [6] "American Samoa"                                      
  [7] "Andorra"                                             
  [8] "Angola"                                              
  [9] "Antigua and Barbuda"                                 
 [10] "Arab World"                                          
 [11] "Argentina"                                           
 [12] "Armenia"                                             
 [13] "Aruba"                                               
 [14] "Australia"                                           
 [15] "Austria"                                             
 [16] "Azerbaijan"                                          
 [17] "Bahamas, The"                                        
 [18] "Bahrain"                                             
 [19] "Bangladesh"                                          
 [20] "Barbados"                                            
 [21] "Belarus"                                             
 [22] "Belgium"                                             
 [23] "Belize"                                              
 [24] "Benin"                                               
 [25] "Bermuda"                                             
 [26] "Bhutan"                                              
 [27] "Bolivia"                                             
 [28] "Bosnia and Herzegovina"                              
 [29] "Botswana"                                            
 [30] "Brazil"                                              
 [31] "British Virgin Islands"                              
 [32] "Brunei Darussalam"                                   
 [33] "Bulgaria"                                            
 [34] "Burkina Faso"                                        
 [35] "Burundi"                                             
 [36] "Cabo Verde"                                          
 [37] "Cambodia"                                            
 [38] "Cameroon"                                            
 [39] "Canada"                                              
 [40] "Caribbean small states"                              
 [41] "Cayman Islands"                                      
 [42] "Central African Republic"                            
 [43] "Central Europe and the Baltics"                      
 [44] "Chad"                                                
 [45] "Channel Islands"                                     
 [46] "Chile"                                               
 [47] "China"                                               
 [48] "Colombia"                                            
 [49] "Comoros"                                             
 [50] "Congo, Dem. Rep."                                    
 [51] "Congo, Rep."                                         
 [52] "Costa Rica"                                          
 [53] "Cote d'Ivoire"                                       
 [54] "Croatia"                                             
 [55] "Cuba"                                                
 [56] "Curacao"                                             
 [57] "Cyprus"                                              
 [58] "Czechia"                                             
 [59] "Denmark"                                             
 [60] "Djibouti"                                            
 [61] "Dominica"                                            
 [62] "Dominican Republic"                                  
 [63] "Early-demographic dividend"                          
 [64] "East Asia & Pacific"                                 
 [65] "East Asia & Pacific (excluding high income)"         
 [66] "East Asia & Pacific (IDA & IBRD countries)"          
 [67] "Ecuador"                                             
 [68] "Egypt, Arab Rep."                                    
 [69] "El Salvador"                                         
 [70] "Equatorial Guinea"                                   
 [71] "Eritrea"                                             
 [72] "Estonia"                                             
 [73] "Eswatini"                                            
 [74] "Ethiopia"                                            
 [75] "Euro area"                                           
 [76] "Europe & Central Asia"                               
 [77] "Europe & Central Asia (excluding high income)"       
 [78] "Europe & Central Asia (IDA & IBRD countries)"        
 [79] "European Union"                                      
 [80] "Faroe Islands"                                       
 [81] "Fiji"                                                
 [82] "Finland"                                             
 [83] "Fragile and conflict affected situations"            
 [84] "France"                                              
 [85] "French Polynesia"                                    
 [86] "Gabon"                                               
 [87] "Gambia, The"                                         
 [88] "Georgia"                                             
 [89] "Germany"                                             
 [90] "Ghana"                                               
 [91] "Gibraltar"                                           
 [92] "Greece"                                              
 [93] "Greenland"                                           
 [94] "Grenada"                                             
 [95] "Guam"                                                
 [96] "Guatemala"                                           
 [97] "Guinea"                                              
 [98] "Guinea-Bissau"                                       
 [99] "Guyana"                                              
[100] "Haiti"                                               
[101] "Heavily indebted poor countries (HIPC)"              
[102] "High income"                                         
[103] "Honduras"                                            
[104] "Hong Kong SAR, China"                                
[105] "Hungary"                                             
[106] "IBRD only"                                           
[107] "Iceland"                                             
[108] "IDA & IBRD total"                                    
[109] "IDA blend"                                           
[110] "IDA only"                                            
[111] "IDA total"                                           
[112] "India"                                               
[113] "Indonesia"                                           
[114] "Iran, Islamic Rep."                                  
[115] "Iraq"                                                
[116] "Ireland"                                             
[117] "Isle of Man"                                         
[118] "Israel"                                              
[119] "Italy"                                               
[120] "Jamaica"                                             
[121] "Japan"                                               
[122] "Jordan"                                              
[123] "Kazakhstan"                                          
[124] "Kenya"                                               
[125] "Kiribati"                                            
[126] "Korea, Dem. People's Rep."                           
[127] "Korea, Rep."                                         
[128] "Kosovo"                                              
[129] "Kuwait"                                              
[130] "Kyrgyz Republic"                                     
[131] "Lao PDR"                                             
[132] "Late-demographic dividend"                           
[133] "Latin America & Caribbean"                           
[134] "Latin America & Caribbean (excluding high income)"   
[135] "Latin America & the Caribbean (IDA & IBRD countries)"
[136] "Latvia"                                              
[137] "Least developed countries: UN classification"        
[138] "Lebanon"                                             
[139] "Lesotho"                                             
[140] "Liberia"                                             
[141] "Libya"                                               
[142] "Liechtenstein"                                       
[143] "Lithuania"                                           
[144] "Low & middle income"                                 
[145] "Low income"                                          
[146] "Lower middle income"                                 
[147] "Luxembourg"                                          
[148] "Macao SAR, China"                                    
[149] "Madagascar"                                          
[150] "Malawi"                                              
[151] "Malaysia"                                            
[152] "Maldives"                                            
[153] "Mali"                                                
[154] "Malta"                                               
[155] "Marshall Islands"                                    
[156] "Mauritania"                                          
[157] "Mauritius"                                           
[158] "Mexico"                                              
[159] "Micronesia, Fed. Sts."                               
[160] "Middle East & North Africa"                          
[161] "Middle East & North Africa (excluding high income)"  
[162] "Middle East & North Africa (IDA & IBRD countries)"   
[163] "Middle income"                                       
[164] "Moldova"                                             
[165] "Monaco"                                              
[166] "Mongolia"                                            
[167] "Montenegro"                                          
[168] "Morocco"                                             
[169] "Mozambique"                                          
[170] "Myanmar"                                             
[171] "Namibia"                                             
[172] "Nauru"                                               
[173] "Nepal"                                               
[174] "Netherlands"                                         
[175] "New Caledonia"                                       
[176] "New Zealand"                                         
[177] "Nicaragua"                                           
[178] "Niger"                                               
[179] "Nigeria"                                             
[180] "North America"                                       
[181] "North Macedonia"                                     
[182] "Northern Mariana Islands"                            
[183] "Norway"                                              
[184] "Not classified"                                      
[185] "OECD members"                                        
[186] "Oman"                                                
[187] "Other small states"                                  
[188] "Pacific island small states"                         
[189] "Pakistan"                                            
[190] "Palau"                                               
[191] "Panama"                                              
[192] "Papua New Guinea"                                    
[193] "Paraguay"                                            
[194] "Peru"                                                
[195] "Philippines"                                         
[196] "Poland"                                              
[197] "Portugal"                                            
[198] "Post-demographic dividend"                           
[199] "Pre-demographic dividend"                            
[200] "Puerto Rico"                                         
[201] "Qatar"                                               
[202] "Romania"                                             
[203] "Russian Federation"                                  
[204] "Rwanda"                                              
[205] "Samoa"                                               
[206] "San Marino"                                          
[207] "Sao Tome and Principe"                               
[208] "Saudi Arabia"                                        
[209] "Senegal"                                             
[210] "Serbia"                                              
[211] "Seychelles"                                          
[212] "Sierra Leone"                                        
[213] "Singapore"                                           
[214] "Sint Maarten (Dutch part)"                           
[215] "Slovak Republic"                                     
[216] "Slovenia"                                            
[217] "Small states"                                        
[218] "Solomon Islands"                                     
[219] "Somalia"                                             
[220] "South Africa"                                        
[221] "South Asia"                                          
[222] "South Asia (IDA & IBRD)"                             
[223] "South Sudan"                                         
[224] "Spain"                                               
[225] "Sri Lanka"                                           
[226] "St. Kitts and Nevis"                                 
[227] "St. Lucia"                                           
[228] "St. Martin (French part)"                            
[229] "St. Vincent and the Grenadines"                      
[230] "Sub-Saharan Africa"                                  
[231] "Sub-Saharan Africa (excluding high income)"          
[232] "Sub-Saharan Africa (IDA & IBRD countries)"           
[233] "Sudan"                                               
[234] "Suriname"                                            
[235] "Sweden"                                              
[236] "Switzerland"                                         
[237] "Syrian Arab Republic"                                
[238] "Tajikistan"                                          
[239] "Tanzania"                                            
[240] "Thailand"                                            
[241] "Timor-Leste"                                         
[242] "Togo"                                                
[243] "Tonga"                                               
[244] "Trinidad and Tobago"                                 
[245] "Tunisia"                                             
[246] "Turkiye"                                             
[247] "Turkmenistan"                                        
[248] "Turks and Caicos Islands"                            
[249] "Tuvalu"                                              
[250] "Uganda"                                              
[251] "Ukraine"                                             
[252] "United Arab Emirates"                                
[253] "United Kingdom"                                      
[254] "United States"                                       
[255] "Upper middle income"                                 
[256] "Uruguay"                                             
[257] "Uzbekistan"                                          
[258] "Vanuatu"                                             
[259] "Venezuela, RB"                                       
[260] "Vietnam"                                             
[261] "Virgin Islands (U.S.)"                               
[262] "West Bank and Gaza"                                  
[263] "World"                                               
[264] "Yemen, Rep."                                         
[265] "Zambia"                                              
[266] "Zimbabwe"                                            

今回は下のように、%>%(パイプと呼びます) で繋げてコードを書きました。

df_gdp %>% distinct(country) %>% pull()

最初は、データ、その中の、異なる国を選択して、書き出してくださいというものです。

これは、

pull(distinct(df_gdp, country))

と同じです。どんどん、かっこの中に入れ子になって複雑になるので、一つ一つのステップを、順に書いたものが、最初のものになります。

df_gdp %>% head()
df_gdp %>% str()

なども可能です。かっこの中に最初に入るものが直前のものという規則になっており、ここでは、データになっています。df_gdp %>% head(10) とすると、上から6行ではなく、10行表示します。

1.2.4 必要に応じて整形 Transform data

変数が多いので、日本の部分だけ filter を使って選択します。country が Japan と一致する場合のみを選択するときは、== を使います。数値ではないので、引用符をつけます。半角を使ってください。

df_gdp %>% filter(country == "Japan")
df_gdp %>% filter(country == "Japan") %>% head(2)

2行目の、gdp の、4.940878e+12 は、Scientific notation と言われるもので、 \[4.940878 \times 10^{12} = 4,940,887,800,000\] を意味します。e+3 は千(thousand)、e+6 は百万(million)、e+9 は、10億(billion)、e+12 は、兆(trillion)ですから、日本の、2021 年の GDP は、約5兆ドルとなります。

1.2.4.1 メモ

head(2) は、上から2行という意味です。tidyverse では、slice(1:2) などで、より複雑な部分を取り出せるようにもなっています。

1.2.5 視覚化 data visualization

1.2.5.1 Fig 1. 日本のGDP の経年変化を折線グラフ(line graph)

df_gdp %>% filter(country == "Japan") %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

df_gdp %>% filter(country == "Japan") %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

日本を選択したときに、それに名前をつけておいて、それを使うこともできますが、名前がどんどん増えるので、それに続けて、コードを書いていく方法をとっています。

ggplot(aes(x = year, y = gdp)) + geom_line()

の部分が、グラフを描く部分で、「x 軸を、year、y 軸を、gdp として、それを、折線グラフで描いてください」というコードです。

Warning: [38;5;238mRemoved 1 row containing missing values

と表示されています。値がない年があることを言っています。2022年のデータがないことがわかっていますから、最初から削除しておくことも可能です。

1.2.5.2 メモ

以下のように、途中に、drop_na(gdp) と入れれば、Warning は表示されません。

df_gdp %>% filter(country == "Japan") %>% drop_na(gdp) %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

1991年以降を見てみたいときは次のようにします。

df_gdp %>% filter(country == "Japan", year > 1990) %>% 
  drop_na(gdp) %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

1.2.5.3 練習 1-Fig.1

  1. 1995年ごろまでは増加しているが、そのあとは、増加減少、さまざま。いくつかのピークの年は、df_gdp %>% filter(country == "Japan") の下の Next を押して、見ていくと、確認できます。
  2. 最後は、コロナの影響かな。

1.2.5.4 練習 2

  • India に変更
df_gdp %>% filter(country == "India") %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

  • World に変更
df_gdp %>% filter(country == "World") %>%
  ggplot(aes(x = year, y = gdp)) + geom_line()

1.2.5.5 メモ

どんなことがわかりますか。いろいろな国について、調べたら、さまざまなことがわかりますね。キリがないかもしれません。このように、一つのデータでも、学ぶことは山ほどあります。そして、考えることも。

1.2.6 データの理解 Understand data

視覚化によって見えてくることがいくつもありますね。どんなことがわかりますか。気づいたこと(observation)をあげてみましょう。

コードを描くことではなく、この部分が、データサイエンスの核の部分です。気づいたことを列挙してみましょう。

1.2.7 さまざまな視覚化

1.2.7.1 Fig 2. 各年ごとのデータの数

summary(df_gdp) で、データ自体は、1960年から2022年までのようですが、日本も、2022年のデータはありませんでしたから、年によって、どの程度データがあるか、調べてみます。

df_gdp %>% drop_na(gdp) %>% ggplot(aes(x = year)) + geom_bar()

df_gdp %>% drop_na(gdp) %>% ggplot(aes(x = year)) + geom_bar()

バー・グラフを使いますが、gdp の値が、欠損値(NA: not available)のデータを削除してから、グラフを描きます。

1.2.7.2 メモ

表で数を出してみることも可能です。

df_gdp %>% drop_na(gdp) %>% group_by(year) %>% summarize(n = n())

1.2.7.3 練習 1-Fig.2

  1. 2000年ぐらいまでは、データがない国もそれなりにある。

  2. 2019年ぐらいから後も、データがない国がいくつかある。

  3. 2022年は、この、GDP のデータは一つもないようである。(WDI で統一したフォーマットになっていることが影響していると思います。)

1.2.7.4 2021年のGDPの降順での表示(1)

最新の2021年のデータはすべてあるわけではなさそうですが、gdp の値が大きい順に並べてみましょう。

df_gdp %>% filter(year == 2021) %>% drop_na(gdp) %>% arrange(desc(gdp))

1.2.7.5 2021年のGDPの降順での表示(2)

最初に、World と表示され、グループや、カテゴリーのデータもあるようですから、それを、まず、削除することが必要です。region の列を見ると、World などは、Aggregates となっているので、そのようなものを削除すればよさそうです。数値の大きい順に並べたいので、desc 降順(descending order)にします。

df_gdp %>% filter(year == 2021, region != "Aggregates") %>% 
  drop_na(gdp) %>% arrange(desc(gdp))

これは、グラフではありませんが、これも一つの視覚化とも考えられないことはありません。

上位7カ国は、United States, China, Japan, Germany, India, United Kingdom, France であることがわかりました。8番目は、Italy でここまでが、GDP が 2兆ドルを越している国となります。

1.2.7.6 Fig 3. 2021年時のGDP上位7カ国のGDP経年変化

df_gdp %>% filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

df_gdp %>% filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

ここでは、最初に、filter を使って、7カ国のデータを選択しています。 そのときには、%in% として、国名を、combine するといういみで、c() とひとまとめにします。数字ではなく、文字なので、引用符で囲んでいます。この場合は、single quote でも構いませんが、半角を使ってください。

このグラフからは、どのようなことがわかりますか。気づいたことを書いてみましょう。

もう少し、このようなグラフをみてみたいというような、メモも大切です。

1.2.7.7 メモ

2021年のデータがない国は何なのか確認したいですよね。そのような国について、調べることも、たいせつだと思います。手間がかかることは確かですが。これらの国の、GDP を調べてみるのも良いかもしれません。それぞれに、理由があるように見えます。

幸福な家族はどれも似通っているが、不幸な家族は不幸のあり方がそれぞれ異なっている。(トルストイ著「アンナ・カレーニナ」より)。All happy families are alike; each unhappy family is unhappy in its own way. は、アンナ・カレーニナ原則(Anna Karenina principle)とも言われ、いろいろな分野で重視されています。わたしがたいせつにしている言葉でもあります。

df_gdp %>% filter(year == 2021, region != "Aggregates") %>% 
  filter(is.na(gdp)) %>% distinct(country) %>% pull()
 [1] "British Virgin Islands"    "Channel Islands"          
 [3] "Cuba"                      "Eritrea"                  
 [5] "Gibraltar"                 "Greenland"                
 [7] "Isle of Man"               "Korea, Dem. People's Rep."
 [9] "Kuwait"                    "Liechtenstein"            
[11] "Northern Mariana Islands"  "San Marino"               
[13] "Sint Maarten (Dutch part)" "South Sudan"              
[15] "St. Martin (French part)"  "Syrian Arab Republic"     
[17] "Turkmenistan"              "Venezuela, RB"            
[19] "Virgin Islands (U.S.)"     "Yemen, Rep."              

1.2.7.8 練習 1-Fig.3

  1. 2010年ごろに、中国のGDP が日本の GDP を超え、それ以降、差が大きくなっている。

  2. 中国の、GDP が アメリカの GDP を越す年も、それほど遠くないように見える。そのときには、中国の人は豊かにもなるのだろうか。

  3. アメリカと中国の、GDP が多いので、それを省いて、グラフを書いてみたい。

1.2.7.9 練習 3

df_gdp %>% filter(iso2c %in% c("JP", "DE", "IN", "GB", "FR")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

  • 期間を制限してみる。
df_gdp %>% filter(iso2c %in% c("JP", "DE", "IN", "GB", "FR"), year > 1990) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

  • BRICS の国々はどうだろうか。
df_gdp %>% filter(iso2c %in% c("BR", "RU", "IN", "CN", "ZA")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

  • 中国は他と桁が違うので、中国以外を見る
df_gdp %>% filter(iso2c %in% c("BR", "RU", "IN", "ZA")) %>%
  ggplot(aes(x = year, y = gdp, col = iso2c)) + geom_line()

1.2.7.10 メモ

これらからも、わかることはたくさんありますね。さらに、考えたいことも、たくさん出てくると思います。みなさんは、どのようなことを考えますか。

1.2.7.11 Fig 4. 世界のGDP における割合(1)

df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR"))  %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2c)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

まず、下の部分が新しいですが、ここでは、年毎にグループにして、その上で、新しい dgp_ratio という名前の列を追加し、その gdp の値を、gdp 合計で割っています。すなわち、世界の、GDP における割合が計算されています。

  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%

下の部分では、geom_area を使って、fill=iso2c により、iso2c ごとに、違う色を塗って、position = “stack” により、積み上げ型の、グラフを描き、境目がわかりやすいように、0.3 の太さの黒の線を描いてください。また、y 軸は、小数点以下を省いたパーセント表示に変えてください。というコードです。

  ggplot(aes(x = year, y = gdp_ratio, fill = iso2c)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

1.2.7.12 メモ

ドイツがちょっと変なので、データを調べてみました。GDP の値が1969年以前はありませんね。

df_gdp %>% filter(iso2c == "DE", year %in% 1960:1970) 

Germany のデータは、1969年まで無いようですね。

1.2.7.13 Fig 4. 世界のGDP における割合(2)

これは、上から、iso2c の アルファベットの順番になっていますが、積み上げの順序を変更することもできます。

df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("US", "CN", "JP", "DE", "IN", "GB", "FR"))  %>%
  mutate(iso2co = factor(iso2c, levels = c("IN", "CN", "FR", "GB", "DE", "JP", "US"))) %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2co)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

これらは、世界全体の GPT における割合です。

どのようなことがわかりますか。

主要国で、60%〜70% を占めていることがわかります。それぞれの国や、幾つかの国の影響力も、ある程度みることができるように見えます。

気づいたこと、疑問に思ったことなどを、書き出してみてください。

1.2.7.14 練習 1-Fig.4,5

  1. ドイツの部分が少し変。データがないようだ。

  2. 80年代、90年代は、日本も大きな割合を占めている。

  3. 近年、中国の割合が増えて、相対的に、他の国の割合が低下している。

  4. GDP 大国で占める割合が大きい。

1.2.7.15 練習 3-4,5

BRICS 2カ国、CN, IN を省いてみる。

df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("US", "JP", "DE", "GB", "FR"))  %>%
  mutate(iso2co = factor(iso2c, levels = c("IN", "CN", "FR", "GB", "DE", "JP", "US"))) %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2co)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

  • BRICS ではどうだろうか。
df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("CN", "IN", "RU", "BR", "ZA"))  %>%
  mutate(iso2co = factor(iso2c, levels = c("ZA", "BR", "RU", "IN", "CN"))) %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2co)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

  • 中国は割合が大きいので省いてみる。
df_gdp %>% 
  filter(region != "Aggregates") %>% drop_na(gdp) %>% 
  group_by(year) %>% mutate(gdp_ratio = gdp/sum(gdp)) %>% ungroup() %>%
  filter(iso2c %in% c("IN", "RU", "BR", "ZA"))  %>%
  mutate(iso2co = factor(iso2c, levels = c("ZA", "BR", "RU", "IN", "CN"))) %>%
  ggplot(aes(x = year, y = gdp_ratio, fill = iso2co)) + geom_area() +
  geom_line(col = "black", position = "stack", linewidth = 0.3) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 1))

GDP が大きな国と、小さな国があるのはわかりますが、それは、どのように分布しているのでしょうか。

ヒストグラムで見てみましょう。ヒストグラムについては、Posit Primers のこちらのビデオがお勧めです。

1.2.7.16 Fig 5. 2021年の世界の国のGDPの分布(1)

修正してあります。

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region  != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_histogram()

小さいところに集中していることがわかりますが、scale_x_log10() を加え、対数軸をとってみます。

\(log10(1000) = 3\), \(log10(1000000) = 6\), \(log10(1000000000) = 9\) などになります。

1.2.7.17 Fig 6. 2021年の世界の国のGDPの分布(2)

修正してあります。

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region  != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_histogram() + scale_x_log10()

幅を変更したり、分ける個数を変更するには binwidth = 0.5 や、bins = 20 を、geom_histogram() のかっこの中に入れます。

1.2.7.18 練習 1-Fig.6

  • GDP が小さいところに集中している。

  • Log10 スケールを使うと、みやすくなる。

  • ここでは、地域なども含めていたので、上では、修正してあります。

  • 1兆ドルを超える国は、非常に少ないことがわかります。

1.2.7.19 練習 6

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region  != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_histogram(bins = 12) + scale_x_log10()

1.2.7.20 Fig 7. 2021年の世界の国のGDPの分布(3)

また、密度曲線に変えるには、geom_density を使います。

修正してあります。

df_gdp %>% drop_na(gdp) %>% 
  filter(year == 2021) %>% filter(region  != "Aggregates") %>%
  ggplot(aes(gdp)) + geom_density() + scale_x_log10()

1.2.7.21 Fig 8. 2021年の世界の国のGDPの分布(4)

これは、2021年のデータですが、density の変化を見てみます。alpha の値は透明度です。

df_gdp %>% drop_na(gdp)  %>% filter(region  != "Aggregates") %>%
  filter(year %in% c(1961, 1971, 1981, 1991, 2001, 2011, 2021)) %>%
  ggplot(aes(gdp, fill = factor(year))) + geom_density(alpha = 0.4) + scale_x_log10()

1.2.7.22 Fig 9. 2021年の世界の国のGDPの分布(5)

少しみにくいので、分けてみます。

df_gdp %>% drop_na(gdp)  %>% filter(region  != "Aggregates") %>%
  filter(year %in% c(1971, 1981, 1991, 2001, 2011, 2021)) %>%
  ggplot(aes(gdp, fill = factor(year))) + 
  geom_density() + scale_x_log10() + facet_wrap(~year)

  • もう少し、年の数を減らしてみる。
df_gdp %>% drop_na(gdp)  %>% filter(region  != "Aggregates") %>%
  filter(year %in% c(1961, 1991, 2021)) %>%
  ggplot(aes(gdp, fill = factor(year))) + geom_density(alpha = 0.4) + scale_x_log10()

これから、見えてくることもありますね。

1.2.7.23 Fig 10. 地域ごとの GDP の分布

いくつかのグループごとに分布をみてみることも可能です。それには、Boxplot が有効です。

Boxplot については、Posit Primers のビデオがお勧めです。

df_gdp %>% drop_na(gdp) %>% filter(region != "Aggregates") %>%
  drop_na(region) %>% filter(year %in% c(2021)) %>%
  ggplot(aes(gdp, region, fill = region)) + 
  geom_boxplot() + scale_x_log10() + labs(y = "") + 
  theme(legend.position = "none")

1.2.7.24 メモ

経年変化も見てみると、見やすいかどうかは別ですが。

df_gdp %>% drop_na(gdp) %>% filter(region != "Aggregates") %>%
  drop_na(region) %>% filter(year %in% c(1961, 1991, 2021)) %>%
  ggplot(aes(region, gdp, fill = factor(year))) + 
  geom_boxplot() + scale_y_log10() + labs(x = "") +
  scale_x_discrete(labels = function(x) stringr::str_wrap(x, width = 10))

1.2.7.25 Fig 11. 収入の多寡による分類ごとの GDP 分布

df_gdp %>% drop_na(gdp) %>% filter(region != "Aggregates") %>%
  drop_na(income) %>% filter(year %in% c(2021)) %>%
  mutate(level = factor(income, c("High income", "Upper middle income", "Lower middle income", "Low income"))) %>%
  ggplot(aes(gdp, level, fill = income)) + 
  geom_boxplot() + scale_x_log10() + labs(y = "") + 
  theme(legend.position = "none")

これからも、いろいろなことがわかりますね。

1.2.7.26 世界地図の準備

地図で、国の income level をみてみましょう。

修正してあります。

library(maps)
gdp_short <- df_gdp %>% filter(year == 2021, region != "Aggregates") %>%
  select(iso2c, gdp, income)
map_world <- map_data('world')
map_gdp <- map_world %>% 
  mutate(iso2c = iso.alpha(region, n=2)) %>% 
  left_join(gdp_short, by = "iso2c") 
head(map_gdp)

1.2.7.27 Fig 12. Income Level による色分け地図

修正してあります。

map_gdp %>% mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = income_level), map = map_world, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

1.2.7.28 Fig 13. GDP による色分け地図

修正してあります。

map_gdp %>% mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(x=long, y=lat, map_id = region, fill = gdp), map = map_world, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

1.2.7.29 練習 7

1980年に変更してみましょう。

library(maps)
gdp_short <- df_gdp %>% filter(year == 1980, region != "Aggregates") %>%
  select(iso2c, gdp, income)
map_world <- map_data('world')
map_gdp <- map_world %>% 
  mutate(iso2c = iso.alpha(region, n=2)) %>% 
  left_join(gdp_short, by = "iso2c") 
head(map_gdp)

1.2.7.30 Fig 12. Income Level による色分け地図 - 1980

変化はありますか。無いようですね。

map_gdp %>% mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = income_level), map = map_world, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

1.2.7.31 Fig 13. GDP による色分け地図 - 1980

こちらは、変化があります。スケールも変わっています。

map_gdp %>% mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(x=long, y=lat, map_id = region, fill = gdp), map = map_world, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

df_gdp %>% filter(country == "China") %>% select(country, year, gdp, income) %>% arrange(year)

1.2.7.32 メモ

地図は、すこし、難しいですが、通常のグラフとは違う情報も得られます。最近は、さまざまな地図が使えるようになっており、例えば、日本の行政区域の名称に対応させると、県別や、市町村別などの地図も、使うことが可能です。

1.3 練習

  1. それぞれのグラフから、わかったこと、問いなどを列挙してみましょう。
  2. Fig 1 の Japan の部分を他の国や、グループ(World など)に変えてみてください。何がわかりますか。
  3. Fig 3 の iso2c で選択する、国を変更してください。何がわかりますか。
  4. Fig 4 または Fig 5 の iso2c の部分を他の国に変更してください。何がわかりますか。
  5. Fig 5 または Fig 6 の、区間の幅や、数を 変更してみてください。何がわかりますか。
  6. Fig 7, Fig 8, Fig 9 の年を変更してみてください。何がわかりますか。
  7. Fig 12, Fig 13 の年を変更してみてください。何がわかりますか。

1.4 まとめ

今回は、経済指標である、GDP を使いました。データサイエンスについて少しずつ、学んでいきます。

コードの説明は、簡単にしかしていませんから、理解するのは難しいと思いますが、いくつかのことは、ご理解いただけると思います。

  • それほど、長くはない、コードで、データを見ていく。R は対話型(interactive)のプログラミング言語と言われています。

  • コードに続けて、結果が表示されるので、コードと出力の対応が見やすい。また、コメントや説明も併記することができる。これは、RMarkdown という形式の中で、コードを書いていることによるものです。RMarkdown は、再現性(reproducibility)と、プログラム・コードの内容をコンピュータにわかるようにでなく、人間にもわかるように記述する(Literate Programming)を実現しています。

  • 視覚化(Visualization)によって、わかることが色々とある。また、視覚化の方法もたくさんあり、いろいろな見方をすることで、データについての理解が深まっていく。

  • 視覚化を通して、データを理解すること、問いを持ち、他の視覚化などを用いて、さらに、理解を深めることがたいせつ。

  • 理解したことを元にして、さらに、そのデータ、または、他のデータを使って、新たな発見をしていく。

統計的な指標も用いますが、それらによって、新しい知識を生み出すとも表現しますが、そのような営み全体が、データサイエンスの核をなす部分だと思います。

LS0tCnRpdGxlOiAi44Gv44GY44KB44Gm44Gu44OH44O844K/44O744K144Kk44Ko44Oz44K544CAMjAyM+W5tDbmnIg45pelIgphdXRob3I6ICJjMTIzNDU2NyBTdXp1a2ksIEguIOmItOacqOWvmyIKZGF0ZTogIkxhc3QgVXBkYXRlZDogYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogY2VydWxlYW4KICAgIG51bWJlcl9zZWN0aW9uczogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKPiAyMDIz5bm0NuaciDjml6XliIbjga7nibnliKXorJvnvqnjga7lhoXlrrnjgavjgIHjgrPjg6Hjg7Pjg4jvvIgqKuODoeODoioq77yJ44Go44CB57e057+S5ZWP6aGM44Gu6Kej562U5L6L44KS5Yqg44GI44Gf44KC44Gu44Gn44GZ44CCCj4KPiDlnLDlm7Pjga7pg6jliIbjgarjganjga/jgIHjgrPjg7zjg4njgYzvvIjplpPpgZXjgYTjgafjga/jgarjgYTjga7jgafjgZnjgYzvvInkuI3pganliIfjgafjgIHvvIjmiYvlhYPjga5QQ+OBp+OBr+Wun+ihjOWPr+iDveOBp+OBl+OBn+OBjO+8iVBvc2l0IENsb3VkIOOBp+OBr+Wun+ihjOS4jeWPr+iDveOBq+OBquOBo+OBpuOBhOOBvuOBl+OBn+OBi+OCieOAgeS/ruato+OBl+OBvuOBl+OBn+OAguS7luOBq+OCguOAgeWIhuW4g+OBruOBqOOBk+OCjeOBp+OAgembhuioiOODh+ODvOOCv++8iEFnZ3JlZ2F0ZXPvvInjgYzlkKvjgb7jgozjgabjgZfjgb7jgaPjgabjgYTjgZ/jga7jgafjgIHjgZ3jgozjgoLjgIHkv67mraPjgZfjgb7jgZfjgZ/jgILkv67mraPjgZfjgZ/jgajjgZPjgo3jgavjga/jgIEqKuS/ruato+OBl+OBvuOBl+OBnyoqIOOBqOabuOOBhOOBpuOBiuOBjeOBvuOBl+OBn+OBruOBp+OAgeOBneOBrumDqOWIhuOBoOOBkeOAgeOCs+ODlOODvOODu+ODmuODvOOCueODiOOBmeOCjOOBsOOAgeWun+ihjOWPr+iDveOBoOOBqOaAneOBhOOBvuOBmeOAggo+Cj4g54Gr5puc5pel44Gu5YiG44Gv44CB44KC44GG5bCR44GX44CB5L+u5q2j44GZ44KL44GL44KC44GX44KM44G+44Gb44KT44CC44GC44G+44KK44CB5YWI5YWI44Gr6YCy44G+44Ga44CB5LiB5a+n44Gr6Kqs5piO44Gn44GN44KM44Gw44Go6aGY44Gj44Gm44GE44G+44GZ44CCCgojIOOBr+OBmOOCgeOBqwoKIyMg44OH44O844K/44K144Kk44Ko44Oz44K577yfCgrjg4fjg7zjgr/jgYvjgonmg4XloLHjgpLlvpfjgovjgajjgY3jgavjga/jgIHlpKfkvZPmrKHjga7jgojjgYbjgarmiYvpoIbjgpLjgajjgorjgb7jgZnjgIIKCjEuICDmupblgpkgU2V0dXAKMi4gIOODh+ODvOOCv+OCkuWPluW+lyBJbXBvcnQgZGF0YQozLiAg44OH44O844K/5qeL6YCg44Gu56K66KqNIFZpZXcgZGF0YQo0LiAg5b+F6KaB44Gr5b+c44GY44Gm5pW05b2iIFRyYW5zZm9ybSBkYXRhCjUuICDoppbopprljJYgVmlzdWFsaXplIGRhdGEKNi4gIOODh+ODvOOCv+OCkueQhuinoyBVbmRlcnN0YW5kIGRhdGEKNy4gIOODrOODneODvOODiOOBquOBqeOBq+OBvuOBqOOCgeOCiyBDb21tdW5pY2F0ZSBkYXRhCgohW10oaHR0cHM6Ly9kMzN3dWJyZmtpMGw2OC5jbG91ZGZyb250Lm5ldC83OTVjMDM5YmEyNTIwNDU1ZDgzM2I0MDM0YmVmYzhjZjM2MGE3MGJhLzU1OGE1L2RpYWdyYW1zL2RhdGEtc2NpZW5jZS1leHBsb3JlLnBuZykKCuWVj+OBhOOCkuOCguOBoeODh+ODvOOCv+OCkuWPluW+l+OBl+OAgeimluimmuWMluOBquOBqeOCkumAmuOBl+OBpuOAgeODh+ODvOOCv+OCkueQhuino+OBl+OAgeOBleOCieOBq+WVj+OBhOOCkua3seOCgeOCi+OCteOCpOOCr+ODq+OBjOOAgeODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaguOOBoOOBqOaAneOBhOOBvuOBmeOAggoKPiBSIOOCkuS9v+OBo+OBn+WIhuaekOOBruS4gOOBpOOBruS+i+OCkuOAgeimi+OBpuihjOOBjeOBvuOBmeOAguS4gOOBpOS4gOOBpOOBruOCs+ODvOODie+8iOOCs+ODs+ODlOODpeODvOOCv+ODu+ODl+ODreOCsOODqeODoO+8ieOBruewoeWNmOOBquiqrOaYjuOBr+OAgeWKoOOBiOOBvuOBmeOBjOOAgeOBguOBvuOCiuOBneOCjOOBq+aNieOCj+OCjOOBmuOAgeODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBqOOBr+S9leOBi+OCkuiAg+OBiOOBquOBjOOCieOAgembsOWbsuawl+OCkuWRs+OCj+OBo+OBpuOBj+OBoOOBleOBhOOAggoKIyMgUiDjga7jg5Hjg4PjgrHjg7zjgrjjgpLmtLvnlKgKCiMjIyDmupblgpkgU2V0dXAKCuS4lueVjOmKgOihjO+8iFdvcmxkIEJhbmvvvInjga7jgIHkuJbnlYzplovnmbrmjIfmqJnvvIhXREk6IFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnPvvInjga7kuIDjgaTjga7jgIFHRFDvvIhHcm9zcyBEb21lc3RpYyBQcm9kdWN0IOWbveWGhee3j+eUn+eUo++8ieOBruODh+ODvOOCv+OBi+OCieWni+OCgeOBvuOBmeOAgkdEUCDjgavjgoLkvZXnqK7poZ7jgYvjga7lsLrluqbjgYzjgYLjgorjgb7jgZnjgYzjgIHmrKHjga7jgoLjga7jgpLopovjgabjgb/jgb7jgZnjgIIKCi0gICBOWS5HRFAuTUtUUC5DRDogR0RQIChjdXJyZW50IFVTXCQpCgpOWS5HRFAuTUtUUC5DRCDjga/jgIHjg4fjg7zjgr/jgrPjg7zjg4njgajoqIDjgo/jgozjgovjgoLjga7jgafjgIHkuJbnlYzplovnmbrmjIfmqJnvvIhXREnvvInjgavjga/jgIHkuIDjgaTjgaXjgaTmsbrjgb7jgaPjgabjgYTjgb7jgZnjgIIKCltXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzXShodHRwczovL2RhdGF0b3BpY3Mud29ybGRiYW5rLm9yZy93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzLykg44Gu44K144Kk44OI44Gu5LiL44Gr44GC44KL44CBRGF0YSBUaGVtZXPvvIjjg4bjg7zjg57vvInjgYvjgonjg4bjg7zjg57jgpLpgbjmip7jgZfjgIHkuIvjgavjgrnjgq/jg63jg7zjg6vjgZnjgovjgajjgIFDb2RlIOOCkuOBv+OCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAguOBoeOBquOBv+OBq+OAgeOBk+OBk+OBp+WIqeeUqOOBmeOCiyBOWS5HRFAuTUtUUC5DRDogR0RQIChjdXJyZW50IFVTXCQpIOOBr+OAgeODhuODvOODnuOBriBFY29ub21577yI57WM5riI77yJ44Gu44CB5LiA55Wq5LiK44Gr44GC44KK44G+44GZ44CCCgrntYzmuIjnlKjoqp7jga7oi7Hoqp7jga/jgojjgY/nn6XjgonjgarjgYTjgajjgYTjgYbmlrnjga/jgIHjg5bjg6njgqbjgrbjg7zvvIhFZGdlLCBHb29nbGUgQ2hyb21lLCBTYWZhcmkg44Gq44Gp77yJ44Gu57+76Kiz5qmf6IO944KS5L2/44GG44Gu44KC6Imv44GE44Gn44GX44KH44GG44CC44Gf44Gg44CB44Gd44Gu44Oa44O844K444Gu5a++6Kmx5Z6L44Gu5qmf6IO977yIaW50ZXJhY3RpdmUgZnVuY3Rpb27vvInjgpLliKnnlKjjgZnjgovjgajjgY3jga/jgIHnv7voqLPmqZ/og73jgpJPRkYg44Gr44GZ44KL5b+F6KaB44GM44GC44KL5aC05ZCI44KC44GC44KK44G+44GZ44Gu44Gn44CB5rOo5oSP44GX44Gm44GP44Gg44GV44GE44CCCgrjgqjjg6njg7zjg6Hjg4Pjgrvjg7zjgrjjgpLoqr/jgbnjgovjgajjgY3jgarjganjgavjgIHoi7Hoqp7jga7jgbvjgYbjgYzmg4XloLHjgYzjgZ/jgY/jgZXjgpPlvpfjgonjgozjgb7jgZnjgYvjgonjgIHoqIDoqp7jgpLjgIHoi7Hoqp7jgavlpInmm7TjgZfjgabjgYrjgY3jgb7jgZnjgIIKClIg44Gr44Gv44CBV0RJIOOBruODh+ODvOOCv+OCkuWPluW+l+OBmeOCiyBSIOOBruODhOODvOODq++8iOODkeODg+OCseODvOOCuO+8iWBXRElgIOOBjOOBguOCiuOBvuOBmeOBi+OCieOAgeOBneOCjOOCkuS9v+OBhOOBvuOBmeOAguOBvuOBn+OAgeODh+ODvOOCv+OCkuWPluOCiuaJseOBhuOBn+OCgeOBruWfuuacrOeahOOBquODhOODvOODq++8iOODkeODg+OCseODvOOCuO+8iWB0aWR5dmVyc2VgIOOCkuS9v+OBhOOBvuOBmeOBruOBp+OAgeasoeOBruOCs+ODvOODieOBp+OAgeOBk+OCjOOCieOCkuiqreOBv+i+vOOBv+OBvuOBmeOAggoKYGBge3J9ClN5cy5zZXRlbnYoTEFORyA9ICJlbiIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgrjg4fjg7zjgr/jgpLkv53lrZjjgZnjgovloLTmiYDjgpLkvZzmiJDjgZfjgabjgYrjgY/jgZPjgajjgpLjgYrli6fjgoHjgZfjgb7jgZnjgILkv53lrZjjgZfjgabjgYrjgY/jgajjgY3jga/jgIHjgZPjga7jg4fjgqPjg6zjgq/jg4jjg6rjgpLkvb/jgYTjgb7jgZnjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CmRpci5jcmVhdGUoIi4vZGF0YSIpCmBgYAoKIyMjIOODh+ODvOOCv+WPluW+lyBJbXBvcnQgZGF0YQoK44OH44O844K/44KS5Y+W5b6X44GX44G+44GZ44CC5bCR44GX5pmC6ZaT44GM44GL44GL44KK44G+44GZ44CC5Y+W5b6X44GX44Gf44OH44O844K/44Gr44CBYGRmX2dkcGAg44Gq44Gp44Go44CB44KP44GL44KK44KE44GZ44GE5ZCN5YmN44KS44Gk44GR44G+44GZ44CCYGRmYCDjga8gYGRhdGEgZnJhbWVgIOOBrueVpeOBp+OAgVIg44Gn5qiZ5rqW55qE44Gq44OH44O844K/44Gu5b2i5byP44Gn44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgCiAgICAgICAgICAgICAgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSwgCiAgICAgICAgICAgICAgZXh0cmEgPSBUUlVFKQpgYGAKCuOBk+OBruOCs+ODvOODieOBp+OAgeWFqOOBpuOBruWbveOBriBHRFAg44KS5Y+W5b6X44Gn44GN44G+44GZ44CCR0RQIOOBruWApOOBr+OAgWBOWS5HRFAuTUtUUC5DRGAg44Go44GE44GG5ZCN5YmN44Gu5YiX44Gr44GC44KK44G+44GZ44GM44CB6Kaa44GI44KE44GZ44GE44KI44GG44Gr44CBZ2RwIOOBqOOBhOOBhuWQjeWJjeOBq+WkieabtOOBl+OBpuOBiuOBjeOBvuOBmeOAgmBleHRyYSA9IFRSVUVgIOOBqOOBmeOCi+OBk+OBqOOBq+OCiOOBo+OBpuOAgeOBneOCjOOBnuOCjOOBruWbveOBq+OBpOOBhOOBpuOBruaDheWgseOBquOBqeOBjOi/veWKoOOBleOCjOOBvuOBmeOAggoKCiMjIyDjg4fjg7zjgr/mp4vpgKDjga7norroqo0KCuacgOWIneOBruaVsOihjOOBoOOBkeOCkuimi+OCi+OBq+OBr+OAgWBoZWFkKGRmX2RncClgIOOBqOOBl+OBvuOBmeOAggoKYGBge3J9CmhlYWQoZGZfZ2RwKQpgYGAKCiMjIyMg44Oh44OiCgrmrKHjga7jgojjgYbjgavjgIFgZXh0cmEgPSBUUlVFYCDjgpLnnIHnlaXjgZfjgIFgZGZfZ2RwYCDjgavnva7jgY3mj5vjgYjjgarjgYTjgafjgIHjgZnjgZDkuK3ouqvjgpLopovjgabjgb/jgovjgajmrKHjga7jgojjgYbjgavjgarjgorjgb7jgZnjgILjgaTjgb7jgorjgIE15YiX44Gu44G/44Gn44GZ44CC44Gk44G+44KK44CB44GT44KM5Lul5aSW44Gu5oOF5aCx44GM44CBZXh0cmEg44Go44GE44GG44GT44Go44Gr44Gq44KK44G+44GZ44CC44G+44Gf44CB572u44GN5o+b44GI44Gq44GP44Gm44KC44CB44GT44Gu44KI44GG44Gr44CB44OH44O844K/44KS6KaL44KL44GT44Go44Gv44Gn44GN44G+44GZ44GM44CB44GT44KM44KS5L2/44GG44Go44GN44Gr44Gv44CB5ZCN5YmN44KS44Gk44GR44Gm44GK44GL44Gq44GR44KM44Gw44GE44GR44G+44Gb44KT44CC44Gd44KM44GM44CBYXNzaWdubWVudCDjgajjgYTjgYYgYDwtYCDjgafjgZfjgb7jgZnjgIJgPWAg44Gn44KC5ZCM44GY44GT44Go44GM44Gn44GN44G+44GZ44GM44CB44Gp44Gh44KJ44KS44CB44Gp44Gh44KJ44Gr572u44GN5o+b44GI44KL44GT44Go44KS5piO56S655qE44Gr44GZ44KL44Gf44KB44Gr44CB55+i5Y2w44GM5o6o5aWo44GV44KM44Gm44GE44G+44GZ44CCV0RJIOOBruOCiOOCiuips+OBl+OBhOS9v+OBhOaWueOBr+OAgeeBq+abnOaXpeOBq+iqrOaYjuOBl+OBvuOBmeOAggoKYGBge3J9CmhlYWQoV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSkpCmBgYAoK5a6f44Gv44CBUk1hcmtkb3duIOOBqOOBhOOBhuaWh+abuOOBruS4reOBp+OBguOCjOOBsOOAgeasoeOBruOCiOOBhuOBq+OAgWBoZWFkKGRmX2dkcClg44Gn44Gv44Gq44GP44CBYGRmX2dkcGAg44Gg44GR44Gn44KC44CB5YaF5a6544GM6KGo56S644GV44KM44CB44GL44Gk44CBYHBhZ2VkYCDjgajjgYTjgYblvaLlvI/jgavjgarjgaPjgabjgYTjgovjga7jgafjgIExMOihjOOBmuOBpOOAgTEwMCDjg5rjg7zjgrjjgaTjgb7jgorjgIExMDAw6KGM44G+44Gn44CB44G/44KL44GT44Go44GM44Gn44GN44G+44GZ44CC44GT44Gu5pa544GM44CB5a6f6Zqb44Gr5YiG5p6Q44GX44Gm44GE44KL44Go44GN44Gr44Gv5L6/5Yip44Gn44GZ44CC44Gf44Gg44CBYGhlYWRgIOOBr+OAgeWfuuacrOOBp+OBmeOBl+OAgeS4i+OBruOCiOOBhuOBquOCguOBruOBq+OBl+OBpuOBhOOCi+OBqOOAgUhUTUwg44KS5L2/44Gj44Gm44GE44KL6ZaT44Gv44KI44GE44Gu44Gn44GZ44GM44CB44GT44KM44KS44CBUERGIOOChOOAgVdvcmQg44Gr5aSJ5o+b44GZ44KL44Go44CB44Gd44KM44KJ44Gu5b2i5byP44Gn44Gv44CB5qmf6IO944GX44Gq44GE44Gu44Gn44CB5ZWP6aGM44GM55Sf44GY44KL44GT44Go44KC44GC44KK44G+44GZ44CC44CM5LuW44Gu5paH5pu45b2i5byP44Gr44KC44Gn44GN44KL44Gu44GL44CN44Go44GE44GG6LOq5ZWP44KC44GC44KK44G+44GX44Gf44CC562U44GI44Gv44CB44CM57Ch5Y2Y44Gr44Gn44GN44G+44GZ44CC44CN44Gn44GZ44GM44CB44Gp44KT44Gq44KC44Gu44Gn44KC44CB44Gp44KT44Gq5b2i5byP44Gn44KC5Ye65Yqb44Gn44GN44KL44GL44Go44GE44GG44Gu44Gv44CB5LiN5Y+v6IO944Gn44GZ44CCUERGIOOChOOAgVdvcmQg44Gr44GT44KM44KJ44Gu5qmf6IO944GM44Gq44GE44GL44KJ44Gn44GZ44CC44CM44GT44KT44Gq44GT44Go44Gv44Gn44GN44G+44GZ44GL44CN44Go44GE44GG44Gu44Gv44CB6Imv44GE6LOq5ZWP44Gn44GZ44GM44CB44G+44Ga44Gv44CB44GT44GT44Gr5o+Q56S644GX44Gm44GE44KL44KC44Gu44KS44CB5bCR44GX44Ga44Gk55CG6Kej44GX44Gm44GE44Gj44Gm44GE44Gf44Gg44GR44KM44Gw44Go5oCd44GE44G+44GZ44CC5bCR44GX44Ga44Gk6Kqs5piO44GX44G+44GZ44CCCgrjgb7jgZ/jgIHjgZPjga7mlrnms5Xjga/jgIHkvr/liKnjgafjgZnjgYzjgIHjgZPjgozjgaDjgZHjgIHjgZ/jgY/jgZXjgpPjgrPjg7Pjg5Tjg6Xjg7zjgr/jgYzjgYTjgaTjgafjgoLkvb/jgYjjgovjgojjgYbjgavjgIHopprjgYjjgabjgYTjgovjgZ/jgoHjgIFSQU0gKFJlYWQgQWNjZXNzIE1lbW9yeSkg44KS44Gf44GP44GV44KT5L2/44Gj44Gm44GX44G+44GG44Gu44Gn44CBUG9zaXQgQ2xvdWQg44Gq44Gp44Gn44Gv44CB44Oh44Oi44Oq44O844GM6Laz44KK44Gq44GP44Gm5paH5pu444GM5L2c5oiQ44Gn44GN44Gq44GE77yIUGFuZG9jIEVycm9yIDEzN++8iSDjgYzlh7rjgovlj6/og73mgKfjgYzjgYLjgorjgb7jgZnjgILjgZ3jgZPjgafjgIHoh6rliIbjga4gUEMg44Gn5L2/44GG44Go44GN44Gv44CB44G744Go44KT44Gp44CB6ICD44GI44Ga44Gr44CB5L2/44GE44G+44GZ44GM44CBUG9zaXQgQ2xvdWQg44Gu44Go44GN44Gv44CB5rOo5oSP44GZ44KL44GT44Go44Gr44GX44Gm44GE44G+44GZ44CCCgpQb3NpdCBDbG91ZCDjgpLkvb/jgYbjgajjgY3jgavjga/jgIFgaGVhZCgpYCDjgpLkvb/jgYbjgZPjgajjgpLjgYrli6fjgoHjgZfjgb7jgZnjgIIKCmBgYHtyfQpkZl9nZHAKYGBgCgrjg4fjg7zjgr/jga7mp4vpgKDjgpLopovjgovjgajjgY3jgavjga/jgIFgc3RyKGRmX2dkcClgIOOCguOCiOOBj+S9v+OCj+OCjOOBvuOBmeOAguS7iuW6puOBr+OAgeWIl+OBjOe4puOBq+S4puOCk+OBp+ihqOekuuOBleOCjOOBvuOBmeOAggoKYGBge3J9CnN0cihkZl9nZHApCmBgYAoKIyMjIyDjg6Hjg6IKCmB0aWR5dmVyc2VgIE5hdGl2ZSDjgafjga/jgIFgc3RyYCDjga7ku6Pjgo/jgorjgavjgIFgZ2xpbXBzZWAg44KS5L2/44GE44G+44GZ44CC5bCR44GX5oOF5aCx44GM5aSa44GE44GL44KJ44Gn44GZ44CC44Gn44KC44CB44GT44Gu56iL5bqm44Gu44KC44Gu44Gq44KJ44CB44G744G85ZCM44GY44Gn44GZ44CC44GT44GT44GL44KJ44KP44GL44KL44GT44Go44Gv44CB6KGM77yI44OH44O844K/44Gu5pWwIE51bWJlciBvZiBPYnNlcnZhdGlvbnMg44Go6KiA44GE44G+44GZ77yJ44GMMTYsNzU444CB5YiX77yI5aSJ5pWw44Gu5pWwIE51bWJlciBvZiBWYXJpYWJsZXMg44Go6KiA44GE44G+44GZ77yJ44GMIDEzIOOBqOOBquOCiuOBvuOBmeOAguOBvuOBn+OAgWBjaHJgIOOBqOOBi+OAgWBpbnRgIOOBqOOBiyBgZGJsYCDvvIhgc3RyYCDjgafjga/jgIFudW3vvInjgajjgYLjgorjgb7jgZnjgYzjgIHjgZPjgozjga/jgIHmloflrZfjg4fjg7zjgr/jgYvjgIHmlbDlgKTjg4fjg7zjgr/jgYvjgIHmlbDlgKTjga7kuK3jgafjgoLjgIHmlbTmlbDlgKTjgYvjgIHlrp/mlbDlgKTjgYvjgYzjgo/jgYvjgovjgojjgYbjgavjgarjgaPjgabjgYTjgb7jgZnjgILjgZPjga7pgZXjgYTjga/jgIHjgajjgabjgoLph43opoHjgafjgZnjgIIKCmBgYHtyfQpnbGltcHNlKGRmX2dkcCkKYGBgCgrmpoLopoEgKGBzdW1tYXJ5KGRmX2dkcClgKSDjgYvjgonjgoLjgYLjgovnqIvluqbjgo/jgYvjgorjgb7jgZnjgIIKCmBgYHtyfQpzdW1tYXJ5KGRmX2dkcCkgCmBgYAoKIyMjIyDjg6Hjg6IKCuW5tO+8iHllYXLvvInjga/jgIExOTYwIOOBi+OCiSAyMDIyIOOBp+OBguOCi+OBk+OBqOOBquOBqeOBjOOCj+OBi+OCiuOBvuOBmeOBreOAggoK5Zu944Gu44Oq44K544OI44KS44G/44Gm44G/44G+44GX44KH44GG44CC44Go44Gm44KC6ZW344GE44Oq44K544OI44Gu5Lit44Gr44Gv44CB5Zyw5Z+f5ZCN44KC5ZCr44G+44KM44Gm44GE44G+44GZ44CCCgoKYGBge3J9CmRmX2dkcCAlPiUgZGlzdGluY3QoY291bnRyeSkgJT4lIHB1bGwoKQpgYGAKCuS7iuWbnuOBr+S4i+OBruOCiOOBhuOBq+OAgWAlPiVg77yI44OR44Kk44OX44Go5ZG844Gz44G+44GZ77yJIOOBp+e5i+OBkuOBpuOCs+ODvOODieOCkuabuOOBjeOBvuOBl+OBn+OAggoKYGBgICAgICAgICAgCmRmX2dkcCAlPiUgZGlzdGluY3QoY291bnRyeSkgJT4lIHB1bGwoKQpgYGAKCuacgOWIneOBr+OAgeODh+ODvOOCv+OAgeOBneOBruS4reOBruOAgeeVsOOBquOCi+WbveOCkumBuOaKnuOBl+OBpuOAgeabuOOBjeWHuuOBl+OBpuOBj+OBoOOBleOBhOOBqOOBhOOBhuOCguOBruOBp+OBmeOAggoK44GT44KM44Gv44CBCgpgYGAgICAgICAgICAKcHVsbChkaXN0aW5jdChkZl9nZHAsIGNvdW50cnkpKQpgYGAKCuOBqOWQjOOBmOOBp+OBmeOAguOBqeOCk+OBqeOCk+OAgeOBi+OBo+OBk+OBruS4reOBq+WFpeOCjOWtkOOBq+OBquOBo+OBpuikh+mbkeOBq+OBquOCi+OBruOBp+OAgeS4gOOBpOS4gOOBpOOBruOCueODhuODg+ODl+OCkuOAgemghuOBq+abuOOBhOOBn+OCguOBruOBjOOAgeacgOWIneOBruOCguOBruOBq+OBquOCiuOBvuOBmeOAggoKYGBgICAgICAgICAgCmRmX2dkcCAlPiUgaGVhZCgpCmRmX2dkcCAlPiUgc3RyKCkKYGBgCgrjgarjganjgoLlj6/og73jgafjgZnjgILjgYvjgaPjgZPjga7kuK3jgavmnIDliJ3jgavlhaXjgovjgoLjga7jgYznm7TliY3jga7jgoLjga7jgajjgYTjgYbopo/liYfjgavjgarjgaPjgabjgYrjgorjgIHjgZPjgZPjgafjga/jgIHjg4fjg7zjgr/jgavjgarjgaPjgabjgYTjgb7jgZnjgIJgZGZfZ2RwICU+JSBoZWFkKDEwKWAg44Go44GZ44KL44Go44CB5LiK44GL44KJNuihjOOBp+OBr+OBquOBj+OAgTEw6KGM6KGo56S644GX44G+44GZ44CCCgojIyMg5b+F6KaB44Gr5b+c44GY44Gm5pW05b2iIFRyYW5zZm9ybSBkYXRhCgrlpInmlbDjgYzlpJrjgYTjga7jgafjgIHml6XmnKzjga7pg6jliIbjgaDjgZEgYGZpbHRlcmAg44KS5L2/44Gj44Gm6YG45oqe44GX44G+44GZ44CCY291bnRyeSDjgYwgSmFwYW4g44Go5LiA6Ie044GZ44KL5aC05ZCI44Gu44G/44KS6YG45oqe44GZ44KL44Go44GN44Gv44CBYD09YCDjgpLkvb/jgYTjgb7jgZnjgILmlbDlgKTjgafjga/jgarjgYTjga7jgafjgIHlvJXnlKjnrKbjgpLjgaTjgZHjgb7jgZnjgILljYrop5LjgpLkvb/jgaPjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyIGNhY2hlID0gVFJVRX0KZGZfZ2RwICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKQpgYGAKCmBgYHtyfQpkZl9nZHAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpICU+JSBoZWFkKDIpCmBgYAoK77yS6KGM55uu44Gu44CBZ2RwIOOBruOAgTQuOTQwODc4ZSsxMiDjga/jgIFTY2llbnRpZmljIG5vdGF0aW9uIOOBqOiogOOCj+OCjOOCi+OCguOBruOBp+OAgSAkJDQuOTQwODc4IFx0aW1lcyAxMF57MTJ9ID0gNCw5NDAsODg3LDgwMCwwMDAkJCDjgpLmhI/lkbPjgZfjgb7jgZnjgIJgZSszYCDjga/ljYPvvIh0aG91c2FuZO+8ieOAgWBlKzZgIOOBr+eZvuS4h++8iG1pbGxpb27vvInjgIFgZSs5YCDjga/jgIExMOWEhO+8iGJpbGxpb27vvInjgIFgZSsxMmAg44Gv44CB5YWG77yIdHJpbGxpb27vvInjgafjgZnjgYvjgonjgIHml6XmnKzjga7jgIEyMDIxIOW5tOOBriBHRFAg44Gv44CB57SENeWFhuODieODq+OBqOOBquOCiuOBvuOBmeOAggoKIyMjIyDjg6Hjg6IKCmBoZWFkKDIpYCDjga/jgIHkuIrjgYvjgonvvJLooYzjgajjgYTjgYbmhI/lkbPjgafjgZnjgIJgdGlkeXZlcnNlYCDjgafjga/jgIFgc2xpY2UoMToyKWAg44Gq44Gp44Gn44CB44KI44KK6KSH6ZuR44Gq6YOo5YiG44KS5Y+W44KK5Ye644Gb44KL44KI44GG44Gr44KC44Gq44Gj44Gm44GE44G+44GZ44CCCgojIyMg6KaW6Kaa5YyWIGRhdGEgdmlzdWFsaXphdGlvbgoKIyMjIyBGaWcgMS4g5pel5pys44GuR0RQIOOBrue1jOW5tOWkieWMluOCkuaKmOe3muOCsOODqeODle+8iGxpbmUgZ3JhcGjvvIkKCmBgYHtyfQpkZl9nZHAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHApKSArIGdlb21fbGluZSgpCmBgYAoKYGBgICAgICAgICAgCmRmX2dkcCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcCkpICsgZ2VvbV9saW5lKCkKYGBgCgrml6XmnKzjgpLpgbjmip7jgZfjgZ/jgajjgY3jgavjgIHjgZ3jgozjgavlkI3liY3jgpLjgaTjgZHjgabjgYrjgYTjgabjgIHjgZ3jgozjgpLkvb/jgYbjgZPjgajjgoLjgafjgY3jgb7jgZnjgYzjgIHlkI3liY3jgYzjganjgpPjganjgpPlopfjgYjjgovjga7jgafjgIHjgZ3jgozjgavntprjgZHjgabjgIHjgrPjg7zjg4njgpLmm7jjgYTjgabjgYTjgY/mlrnms5XjgpLjgajjgaPjgabjgYTjgb7jgZnjgIIKCmBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwKSkgKyBnZW9tX2xpbmUoKWAKCuOBrumDqOWIhuOBjOOAgeOCsOODqeODleOCkuaPj+OBj+mDqOWIhuOBp+OAgeOAjHgg6Lu444KS44CBeWVhcuOAgXkg6Lu444KS44CBZ2RwIOOBqOOBl+OBpuOAgeOBneOCjOOCkuOAgeaKmOe3muOCsOODqeODleOBp+aPj+OBhOOBpuOBj+OBoOOBleOBhOOAjeOBqOOBhOOBhuOCs+ODvOODieOBp+OBmeOAggoKV2FybmluZzogWzM4OzU7MjM4bVJlbW92ZWQgMSByb3cgY29udGFpbmluZyBtaXNzaW5nIHZhbHVlcwoK44Go6KGo56S644GV44KM44Gm44GE44G+44GZ44CC5YCk44GM44Gq44GE5bm044GM44GC44KL44GT44Go44KS6KiA44Gj44Gm44GE44G+44GZ44CCMjAyMuW5tOOBruODh+ODvOOCv+OBjOOBquOBhOOBk+OBqOOBjOOCj+OBi+OBo+OBpuOBhOOBvuOBmeOBi+OCieOAgeacgOWIneOBi+OCieWJiumZpOOBl+OBpuOBiuOBj+OBk+OBqOOCguWPr+iDveOBp+OBmeOAggoKIyMjIyDjg6Hjg6IKCuS7peS4i+OBruOCiOOBhuOBq+OAgemAlOS4reOBq+OAgWBkcm9wX25hKGdkcClgIOOBqOWFpeOCjOOCjOOBsOOAgVdhcm5pbmcg44Gv6KGo56S644GV44KM44G+44Gb44KT44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSAlPiUgZHJvcF9uYShnZHApICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHApKSArIGdlb21fbGluZSgpCmBgYAoKMTk5MeW5tOS7pemZjeOCkuimi+OBpuOBv+OBn+OBhOOBqOOBjeOBr+asoeOBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiwgeWVhciA+IDE5OTApICU+JSAKICBkcm9wX25hKGdkcCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcCkpICsgZ2VvbV9saW5lKCkKYGBgCgoKIyMjIyDnt7Tnv5IgMS1GaWcuMQoKMS4gIDE5OTXlubTjgZTjgo3jgb7jgafjga/lopfliqDjgZfjgabjgYTjgovjgYzjgIHjgZ3jga7jgYLjgajjga/jgIHlopfliqDmuJvlsJHjgIHjgZXjgb7jgZbjgb7jgILjgYTjgY/jgaTjgYvjga7jg5Tjg7zjgq/jga7lubTjga/jgIFgZGZfZ2RwICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKWAg44Gu5LiL44GuIE5leHQg44KS5oq844GX44Gm44CB6KaL44Gm44GE44GP44Go44CB56K66KqN44Gn44GN44G+44GZ44CCCjIuICDmnIDlvozjga/jgIHjgrPjg63jg4rjga7lvbHpn7/jgYvjgarjgIIKCiMjIyMg57e057+SIDIgCgoqIEluZGlhIOOBq+WkieabtAoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkluZGlhIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcCkpICsgZ2VvbV9saW5lKCkKYGBgCgoqIFdvcmxkIOOBq+WkieabtAoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIldvcmxkIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcCkpICsgZ2VvbV9saW5lKCkKYGBgCgojIyMjIOODoeODogoK44Gp44KT44Gq44GT44Go44GM44KP44GL44KK44G+44GZ44GL44CC44GE44KN44GE44KN44Gq5Zu944Gr44Gk44GE44Gm44CB6Kq/44G544Gf44KJ44CB44GV44G+44GW44G+44Gq44GT44Go44GM44KP44GL44KK44G+44GZ44Gt44CC44Kt44Oq44GM44Gq44GE44GL44KC44GX44KM44G+44Gb44KT44CC44GT44Gu44KI44GG44Gr44CB5LiA44Gk44Gu44OH44O844K/44Gn44KC44CB5a2m44G244GT44Go44Gv5bGx44G744Gp44GC44KK44G+44GZ44CC44Gd44GX44Gm44CB6ICD44GI44KL44GT44Go44KC44CCCgojIyMg44OH44O844K/44Gu55CG6KejIFVuZGVyc3RhbmQgZGF0YQoK6KaW6Kaa5YyW44Gr44KI44Gj44Gm6KaL44GI44Gm44GP44KL44GT44Go44GM44GE44GP44Gk44KC44GC44KK44G+44GZ44Gt44CC44Gp44KT44Gq44GT44Go44GM44KP44GL44KK44G+44GZ44GL44CC5rCX44Gl44GE44Gf44GT44Go77yIb2JzZXJ2YXRpb27vvInjgpLjgYLjgZLjgabjgb/jgb7jgZfjgofjgYbjgIIKCuOCs+ODvOODieOCkuaPj+OBj+OBk+OBqOOBp+OBr+OBquOBj+OAgeOBk+OBrumDqOWIhuOBjOOAgeODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaguOOBrumDqOWIhuOBp+OBmeOAguawl+OBpeOBhOOBn+OBk+OBqOOCkuWIl+aMmeOBl+OBpuOBv+OBvuOBl+OCh+OBhuOAggoKIyMjIOOBleOBvuOBluOBvuOBquimluimmuWMlgoKIyMjIyBGaWcgMi4g5ZCE5bm044GU44Go44Gu44OH44O844K/44Gu5pWwCgpgc3VtbWFyeShkZl9nZHApYCDjgafjgIHjg4fjg7zjgr/oh6rkvZPjga/jgIExOTYw5bm044GL44KJMjAyMuW5tOOBvuOBp+OBruOCiOOBhuOBp+OBmeOBjOOAgeaXpeacrOOCguOAgTIwMjLlubTjga7jg4fjg7zjgr/jga/jgYLjgorjgb7jgZvjgpPjgafjgZfjgZ/jgYvjgonjgIHlubTjgavjgojjgaPjgabjgIHjganjga7nqIvluqbjg4fjg7zjgr/jgYzjgYLjgovjgYvjgIHoqr/jgbnjgabjgb/jgb7jgZnjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgZ2dwbG90KGFlcyh4ID0geWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCmBgYCAgICAgICAgIApkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgZ2dwbG90KGFlcyh4ID0geWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCuODkOODvOODu+OCsOODqeODleOCkuS9v+OBhOOBvuOBmeOBjOOAgWBnZHBgIOOBruWApOOBjOOAgeasoOaQjeWApO+8iE5BOiBub3QgYXZhaWxhYmxl77yJ44Gu44OH44O844K/44KS5YmK6Zmk44GX44Gm44GL44KJ44CB44Kw44Op44OV44KS5o+P44GN44G+44GZ44CCCgojIyMjIOODoeODogoK6KGo44Gn5pWw44KS5Ye644GX44Gm44G/44KL44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBkcm9wX25hKGdkcCkgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBzdW1tYXJpemUobiA9IG4oKSkKYGBgCgoKIyMjIyDnt7Tnv5IgMS1GaWcuMgoKMS4gIDIwMDDlubTjgZDjgonjgYTjgb7jgafjga/jgIHjg4fjg7zjgr/jgYzjgarjgYTlm73jgoLjgZ3jgozjgarjgorjgavjgYLjgovjgIIKCjIuICAyMDE55bm044GQ44KJ44GE44GL44KJ5b6M44KC44CB44OH44O844K/44GM44Gq44GE5Zu944GM44GE44GP44Gk44GL44GC44KL44CCCgozLiAgMjAyMuW5tOOBr+OAgeOBk+OBruOAgUdEUCDjga7jg4fjg7zjgr/jga/kuIDjgaTjgoLjgarjgYTjgojjgYbjgafjgYLjgovjgILvvIhXREkg44Gn57Wx5LiA44GX44Gf44OV44Kp44O844Oe44OD44OI44Gr44Gq44Gj44Gm44GE44KL44GT44Go44GM5b2x6Z+/44GX44Gm44GE44KL44Go5oCd44GE44G+44GZ44CC77yJCgojIyMjIDIwMjHlubTjga5HRFDjga7pmY3poIbjgafjga7ooajnpLrvvIjvvJHvvIkKCuacgOaWsOOBrjIwMjHlubTjga7jg4fjg7zjgr/jga/jgZnjgbnjgabjgYLjgovjgo/jgZHjgafjga/jgarjgZXjgZ3jgYbjgafjgZnjgYzjgIFgZ2RwYCDjga7lgKTjgYzlpKfjgY3jgYTpoIbjgavkuKbjgbnjgabjgb/jgb7jgZfjgofjgYbjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSBkcm9wX25hKGdkcCkgJT4lIGFycmFuZ2UoZGVzYyhnZHApKQpgYGAKCiMjIyMgMjAyMeW5tOOBrkdEUOOBrumZjemghuOBp+OBruihqOekuu+8iO+8ku+8iQoK5pyA5Yid44Gr44CBV29ybGQg44Go6KGo56S644GV44KM44CB44Kw44Or44O844OX44KE44CB44Kr44OG44K044Oq44O844Gu44OH44O844K/44KC44GC44KL44KI44GG44Gn44GZ44GL44KJ44CB44Gd44KM44KS44CB44G+44Ga44CB5YmK6Zmk44GZ44KL44GT44Go44GM5b+F6KaB44Gn44GZ44CCYHJlZ2lvbmAg44Gu5YiX44KS6KaL44KL44Go44CBV29ybGQg44Gq44Gp44Gv44CBQWdncmVnYXRlcyDjgajjgarjgaPjgabjgYTjgovjga7jgafjgIHjgZ3jga7jgojjgYbjgarjgoLjga7jgpLliYrpmaTjgZnjgozjgbDjgojjgZXjgZ3jgYbjgafjgZnjgILmlbDlgKTjga7lpKfjgY3jgYTpoIbjgavkuKbjgbnjgZ/jgYTjga7jgafjgIFgZGVzY2Ag6ZmN6aCG77yIZGVzY2VuZGluZyBvcmRlcu+8ieOBq+OBl+OBvuOBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKHllYXIgPT0gMjAyMSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lIAogIGRyb3BfbmEoZ2RwKSAlPiUgYXJyYW5nZShkZXNjKGdkcCkpCmBgYAoK44GT44KM44Gv44CB44Kw44Op44OV44Gn44Gv44GC44KK44G+44Gb44KT44GM44CB44GT44KM44KC5LiA44Gk44Gu6KaW6Kaa5YyW44Go44KC6ICD44GI44KJ44KM44Gq44GE44GT44Go44Gv44GC44KK44G+44Gb44KT44CCCgrkuIrkvY3vvJfjgqvlm73jga/jgIFVbml0ZWQgU3RhdGVzLCBDaGluYSwgSmFwYW4sIEdlcm1hbnksIEluZGlhLCBVbml0ZWQgS2luZ2RvbSwgRnJhbmNlIOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBl+OBn+OAgjjnlarnm67jga/jgIFJdGFseSDjgafjgZPjgZPjgb7jgafjgYzjgIFHRFAg44GMIDLlhYbjg4njg6vjgpLotorjgZfjgabjgYTjgovlm73jgajjgarjgorjgb7jgZnjgIIKCiMjIyMgRmlnIDMuIDIwMjHlubTmmYLjga5HRFDkuIrkvY0344Kr5Zu944GuR0RQ57WM5bm05aSJ5YyWCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoaXNvMmMgJWluJSBjKCJVUyIsICJDTiIsICJKUCIsICJERSIsICJJTiIsICJHQiIsICJGUiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwLCBjb2wgPSBpc28yYykpICsgZ2VvbV9saW5lKCkKYGBgCgpgYGAgICAgICAgICAKZGZfZ2RwICU+JSBmaWx0ZXIoaXNvMmMgJWluJSBjKCJVUyIsICJDTiIsICJKUCIsICJERSIsICJJTiIsICJHQiIsICJGUiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwLCBjb2wgPSBpc28yYykpICsgZ2VvbV9saW5lKCkKYGBgCgrjgZPjgZPjgafjga/jgIHmnIDliJ3jgavjgIFgZmlsdGVyYCDjgpLkvb/jgaPjgabjgIE344Kr5Zu944Gu44OH44O844K/44KS6YG45oqe44GX44Gm44GE44G+44GZ44CCIOOBneOBruOBqOOBjeOBq+OBr+OAgWAlaW4lYCDjgajjgZfjgabjgIHlm73lkI3jgpLjgIFjb21iaW5lIOOBmeOCi+OBqOOBhOOBhuOBhOOBv+OBp+OAgWBjKClgIOOBqOOBsuOBqOOBvuOBqOOCgeOBq+OBl+OBvuOBmeOAguaVsOWtl+OBp+OBr+OBquOBj+OAgeaWh+Wtl+OBquOBruOBp+OAgeW8leeUqOespuOBp+WbsuOCk+OBp+OBhOOBvuOBmeOAguOBk+OBruWgtOWQiOOBr+OAgXNpbmdsZSBxdW90ZSDjgafjgoLmp4vjgYTjgb7jgZvjgpPjgYzjgIHljYrop5LjgpLkvb/jgaPjgabjgY/jgaDjgZXjgYTjgIIKCuOBk+OBruOCsOODqeODleOBi+OCieOBr+OAgeOBqeOBruOCiOOBhuOBquOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAguawl+OBpeOBhOOBn+OBk+OBqOOCkuabuOOBhOOBpuOBv+OBvuOBl+OCh+OBhuOAggoK44KC44GG5bCR44GX44CB44GT44Gu44KI44GG44Gq44Kw44Op44OV44KS44G/44Gm44G/44Gf44GE44Go44GE44GG44KI44GG44Gq44CB44Oh44Oi44KC5aSn5YiH44Gn44GZ44CCCgojIyMjIOODoeODogoKMjAyMeW5tOOBruODh+ODvOOCv+OBjOOBquOBhOWbveOBr+S9leOBquOBruOBi+eiuuiqjeOBl+OBn+OBhOOBp+OBmeOCiOOBreOAguOBneOBruOCiOOBhuOBquWbveOBq+OBpOOBhOOBpuOAgeiqv+OBueOCi+OBk+OBqOOCguOAgeOBn+OBhOOBm+OBpOOBoOOBqOaAneOBhOOBvuOBmeOAguaJi+mWk+OBjOOBi+OBi+OCi+OBk+OBqOOBr+eiuuOBi+OBp+OBmeOBjOOAguOBk+OCjOOCieOBruWbveOBruOAgUdEUCDjgpLoqr/jgbnjgabjgb/jgovjga7jgoLoia/jgYTjgYvjgoLjgZfjgozjgb7jgZvjgpPjgILjgZ3jgozjgZ7jgozjgavjgIHnkIbnlLHjgYzjgYLjgovjgojjgYbjgavopovjgYjjgb7jgZnjgIIKCj4g5bm456aP44Gq5a625peP44Gv44Gp44KM44KC5Ly86YCa44Gj44Gm44GE44KL44GM44CB5LiN5bm444Gq5a625peP44Gv5LiN5bm444Gu44GC44KK5pa544GM44Gd44KM44Ge44KM55Ww44Gq44Gj44Gm44GE44KL44CCKOODiOODq+OCueODiOOCpOiRl+OAjOOCouODs+ODiuODu+OCq+ODrOODvOODi+ODiuOAjeOCiOOCiinjgIJBbGwgaGFwcHkgZmFtaWxpZXMgYXJlIGFsaWtlOyBlYWNoIHVuaGFwcHkgZmFtaWx5IGlzIHVuaGFwcHkgaW4gaXRzIG93biB3YXkuIOOBr+OAgeOCouODs+ODiuODu+OCq+ODrOODvOODi+ODiuWOn+WJh++8iEFubmEgS2FyZW5pbmEgcHJpbmNpcGxl77yJ44Go44KC6KiA44KP44KM44CB44GE44KN44GE44KN44Gq5YiG6YeO44Gn6YeN6KaW44GV44KM44Gm44GE44G+44GZ44CC44KP44Gf44GX44GM44Gf44GE44Gb44Gk44Gr44GX44Gm44GE44KL6KiA6JGJ44Gn44KC44GC44KK44G+44GZ44CCCgoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKHllYXIgPT0gMjAyMSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lIAogIGZpbHRlcihpcy5uYShnZHApKSAlPiUgZGlzdGluY3QoY291bnRyeSkgJT4lIHB1bGwoKQpgYGAKCgojIyMjIOe3tOe/kiAxLUZpZy4zCgoxLiAgMjAxMOW5tOOBlOOCjeOBq+OAgeS4reWbveOBrkdEUCDjgYzml6XmnKzjga4gR0RQIOOCkui2heOBiOOAgeOBneOCjOS7pemZjeOAgeW3ruOBjOWkp+OBjeOBj+OBquOBo+OBpuOBhOOCi+OAggoKMi4gIOS4reWbveOBruOAgUdEUCDjgYwg44Ki44Oh44Oq44Kr44GuIEdEUCDjgpLotorjgZnlubTjgoLjgIHjgZ3jgozjgbvjganpgaDjgY/jgarjgYTjgojjgYbjgavopovjgYjjgovjgILjgZ3jga7jgajjgY3jgavjga/jgIHkuK3lm73jga7kurrjga/osYrjgYvjgavjgoLjgarjgovjga7jgaDjgo3jgYbjgYvjgIIKCjIuICDjgqLjg6Hjg6rjgqvjgajkuK3lm73jga7jgIFHRFAg44GM5aSa44GE44Gu44Gn44CB44Gd44KM44KS55yB44GE44Gm44CB44Kw44Op44OV44KS5pu444GE44Gm44G/44Gf44GE44CCCgojIyMjIOe3tOe/kiAzCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoaXNvMmMgJWluJSBjKCJKUCIsICJERSIsICJJTiIsICJHQiIsICJGUiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwLCBjb2wgPSBpc28yYykpICsgZ2VvbV9saW5lKCkKYGBgCgoqIOacn+mWk+OCkuWItumZkOOBl+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKGlzbzJjICVpbiUgYygiSlAiLCAiREUiLCAiSU4iLCAiR0IiLCAiRlIiKSwgeWVhciA+IDE5OTApICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHAsIGNvbCA9IGlzbzJjKSkgKyBnZW9tX2xpbmUoKQpgYGAKCiogQlJJQ1Mg44Gu5Zu944CF44Gv44Gp44GG44Gg44KN44GG44GL44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoaXNvMmMgJWluJSBjKCJCUiIsICJSVSIsICJJTiIsICJDTiIsICJaQSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwLCBjb2wgPSBpc28yYykpICsgZ2VvbV9saW5lKCkKYGBgCgoqIOS4reWbveOBr+S7luOBqOahgeOBjOmBleOBhuOBruOBp+OAgeS4reWbveS7peWkluOCkuimi+OCiwoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKGlzbzJjICVpbiUgYygiQlIiLCAiUlUiLCAiSU4iLCAiWkEiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcCwgY29sID0gaXNvMmMpKSArIGdlb21fbGluZSgpCmBgYAoKIyMjIyDjg6Hjg6IKCuOBk+OCjOOCieOBi+OCieOCguOAgeOCj+OBi+OCi+OBk+OBqOOBr+OBn+OBj+OBleOCk+OBguOCiuOBvuOBmeOBreOAguOBleOCieOBq+OAgeiAg+OBiOOBn+OBhOOBk+OBqOOCguOAgeOBn+OBj+OBleOCk+WHuuOBpuOBj+OCi+OBqOaAneOBhOOBvuOBmeOAguOBv+OBquOBleOCk+OBr+OAgeOBqeOBruOCiOOBhuOBquOBk+OBqOOCkuiAg+OBiOOBvuOBmeOBi+OAggoKIyMjIyBGaWcgNC4g5LiW55WM44GuR0RQIOOBq+OBiuOBkeOCi+WJsuWQiO+8iO+8ke+8iQoKYGBge3J9CmRmX2dkcCAlPiUgCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JSBtdXRhdGUoZ2RwX3JhdGlvID0gZ2RwL3N1bShnZHApKSAlPiUgdW5ncm91cCgpICU+JQogIGZpbHRlcihpc28yYyAlaW4lIGMoIlVTIiwgIkNOIiwgIkpQIiwgIkRFIiwgIklOIiwgIkdCIiwgIkZSIikpICAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3JhdGlvLCBmaWxsID0gaXNvMmMpKSArIGdlb21fYXJlYSgpICsKICBnZW9tX2xpbmUoY29sID0gImJsYWNrIiwgcG9zaXRpb24gPSAic3RhY2siLCBsaW5ld2lkdGggPSAwLjMpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkKYGBgCgrjgb7jgZrjgIHkuIvjga7pg6jliIbjgYzmlrDjgZfjgYTjgafjgZnjgYzjgIHjgZPjgZPjgafjga/jgIHlubTmr47jgavjgrDjg6vjg7zjg5fjgavjgZfjgabjgIHjgZ3jga7kuIrjgafjgIHmlrDjgZfjgYQgYGRncF9yYXRpb2Ag44Go44GE44GG5ZCN5YmN44Gu5YiX44KS6L+95Yqg44GX44CB44Gd44GuIGdkcCDjga7lgKTjgpLjgIFnZHAg5ZCI6KiI44Gn5Ymy44Gj44Gm44GE44G+44GZ44CC44GZ44Gq44KP44Gh44CB5LiW55WM44Gu44CBR0RQIOOBq+OBiuOBkeOCi+WJsuWQiOOBjOioiOeul+OBleOCjOOBpuOBhOOBvuOBmeOAggoKYGBgICAgICAgICAgCiAgZ3JvdXBfYnkoeWVhcikgJT4lIG11dGF0ZShnZHBfcmF0aW8gPSBnZHAvc3VtKGdkcCkpICU+JSB1bmdyb3VwKCkgJT4lCmBgYAoK5LiL44Gu6YOo5YiG44Gn44Gv44CBYGdlb21fYXJlYWAg44KS5L2/44Gj44Gm44CBYGZpbGw9aXNvMmNgIOOBq+OCiOOCiuOAgWBpc28yY2Ag44GU44Go44Gr44CB6YGV44GG6Imy44KS5aGX44Gj44Gm44CBcG9zaXRpb24gPSAic3RhY2siIOOBq+OCiOOCiuOAgeepjeOBv+S4iuOBkuWei+OBruOAgeOCsOODqeODleOCkuaPj+OBjeOAgeWig+ebruOBjOOCj+OBi+OCiuOChOOBmeOBhOOCiOOBhuOBq+OAgTAuMyDjga7lpKrjgZXjga7pu5Ljga7nt5rjgpLmj4/jgYTjgabjgY/jgaDjgZXjgYTjgILjgb7jgZ/jgIF5IOi7uOOBr+OAgeWwj+aVsOeCueS7peS4i+OCkuecgeOBhOOBn+ODkeODvOOCu+ODs+ODiOihqOekuuOBq+WkieOBiOOBpuOBj+OBoOOBleOBhOOAguOBqOOBhOOBhuOCs+ODvOODieOBp+OBmeOAggoKYGBgICAgICAgICAgCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcF9yYXRpbywgZmlsbCA9IGlzbzJjKSkgKyBnZW9tX2FyZWEoKSArCiAgZ2VvbV9saW5lKGNvbCA9ICJibGFjayIsIHBvc2l0aW9uID0gInN0YWNrIiwgbGluZXdpZHRoID0gMC4zKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpCmBgYAoKIyMjIyDjg6Hjg6IKCuODieOCpOODhOOBjOOBoeOCh+OBo+OBqOWkieOBquOBruOBp+OAgeODh+ODvOOCv+OCkuiqv+OBueOBpuOBv+OBvuOBl+OBn+OAgkdEUCDjga7lgKTjgYwxOTY55bm05Lul5YmN44Gv44GC44KK44G+44Gb44KT44Gt44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBmaWx0ZXIoaXNvMmMgPT0gIkRFIiwgeWVhciAlaW4lIDE5NjA6MTk3MCkgCmBgYAoKR2VybWFueSDjga7jg4fjg7zjgr/jga/jgIExOTY55bm044G+44Gn54Sh44GE44KI44GG44Gn44GZ44Gt44CCCgojIyMjIEZpZyA0LiDkuJbnlYzjga5HRFAg44Gr44GK44GR44KL5Ymy5ZCI77yI77yS77yJCgrjgZPjgozjga/jgIHkuIrjgYvjgonjgIFpc28yYyDjga4g44Ki44Or44OV44Kh44OZ44OD44OI44Gu6aCG55Wq44Gr44Gq44Gj44Gm44GE44G+44GZ44GM44CB56mN44G/5LiK44GS44Gu6aCG5bqP44KS5aSJ5pu044GZ44KL44GT44Go44KC44Gn44GN44G+44GZ44CCCgpgYGB7cn0KZGZfZ2RwICU+JSAKICBmaWx0ZXIocmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lIG11dGF0ZShnZHBfcmF0aW8gPSBnZHAvc3VtKGdkcCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKGlzbzJjICVpbiUgYygiVVMiLCAiQ04iLCAiSlAiLCAiREUiLCAiSU4iLCAiR0IiLCAiRlIiKSkgICU+JQogIG11dGF0ZShpc28yY28gPSBmYWN0b3IoaXNvMmMsIGxldmVscyA9IGMoIklOIiwgIkNOIiwgIkZSIiwgIkdCIiwgIkRFIiwgIkpQIiwgIlVTIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3JhdGlvLCBmaWxsID0gaXNvMmNvKSkgKyBnZW9tX2FyZWEoKSArCiAgZ2VvbV9saW5lKGNvbCA9ICJibGFjayIsIHBvc2l0aW9uID0gInN0YWNrIiwgbGluZXdpZHRoID0gMC4zKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpCmBgYAoK44GT44KM44KJ44Gv44CB5LiW55WM5YWo5L2T44GuIEdQVCDjgavjgYrjgZHjgovlibLlkIjjgafjgZnjgIIKCuOBqeOBruOCiOOBhuOBquOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggoK5Li76KaB5Zu944Gn44CBNjAl44CcNzAlIOOCkuWNoOOCgeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAguOBneOCjOOBnuOCjOOBruWbveOChOOAgeW5vuOBpOOBi+OBruWbveOBruW9semfv+WKm+OCguOAgeOBguOCi+eoi+W6puOBv+OCi+OBk+OBqOOBjOOBp+OBjeOCi+OCiOOBhuOBq+imi+OBiOOBvuOBmeOAggoK5rCX44Gl44GE44Gf44GT44Go44CB55aR5ZWP44Gr5oCd44Gj44Gf44GT44Go44Gq44Gp44KS44CB5pu444GN5Ye644GX44Gm44G/44Gm44GP44Gg44GV44GE44CCCgojIyMjIOe3tOe/kiAxLUZpZy40LDUKCjEuICDjg4njgqTjg4Tjga7pg6jliIbjgYzlsJHjgZflpInjgILjg4fjg7zjgr/jgYzjgarjgYTjgojjgYbjgaDjgIIKCjIuICA4MOW5tOS7o+OAgTkw5bm05Luj44Gv44CB5pel5pys44KC5aSn44GN44Gq5Ymy5ZCI44KS5Y2g44KB44Gm44GE44KL44CCCgozLiAg6L+R5bm044CB5Lit5Zu944Gu5Ymy5ZCI44GM5aKX44GI44Gm44CB55u45a++55qE44Gr44CB5LuW44Gu5Zu944Gu5Ymy5ZCI44GM5L2O5LiL44GX44Gm44GE44KL44CCCgo0LiAgR0RQIOWkp+WbveOBp+WNoOOCgeOCi+WJsuWQiOOBjOWkp+OBjeOBhOOAggoKIyMjIyDnt7Tnv5IgMy00LDUKCkJSSUNTIO+8kuOCq+WbveOAgUNOLCBJTiDjgpLnnIHjgYTjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIAogIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUgZHJvcF9uYShnZHApICU+JSAKICBncm91cF9ieSh5ZWFyKSAlPiUgbXV0YXRlKGdkcF9yYXRpbyA9IGdkcC9zdW0oZ2RwKSkgJT4lIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoaXNvMmMgJWluJSBjKCJVUyIsICJKUCIsICJERSIsICJHQiIsICJGUiIpKSAgJT4lCiAgbXV0YXRlKGlzbzJjbyA9IGZhY3Rvcihpc28yYywgbGV2ZWxzID0gYygiSU4iLCAiQ04iLCAiRlIiLCAiR0IiLCAiREUiLCAiSlAiLCAiVVMiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHBfcmF0aW8sIGZpbGwgPSBpc28yY28pKSArIGdlb21fYXJlYSgpICsKICBnZW9tX2xpbmUoY29sID0gImJsYWNrIiwgcG9zaXRpb24gPSAic3RhY2siLCBsaW5ld2lkdGggPSAwLjMpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkKYGBgCgoqIEJSSUNTIOOBp+OBr+OBqeOBhuOBoOOCjeOBhuOBi+OAggoKYGBge3J9CmRmX2dkcCAlPiUgCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JSBtdXRhdGUoZ2RwX3JhdGlvID0gZ2RwL3N1bShnZHApKSAlPiUgdW5ncm91cCgpICU+JQogIGZpbHRlcihpc28yYyAlaW4lIGMoIkNOIiwgIklOIiwgIlJVIiwgIkJSIiwgIlpBIikpICAlPiUKICBtdXRhdGUoaXNvMmNvID0gZmFjdG9yKGlzbzJjLCBsZXZlbHMgPSBjKCJaQSIsICJCUiIsICJSVSIsICJJTiIsICJDTiIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcF9yYXRpbywgZmlsbCA9IGlzbzJjbykpICsgZ2VvbV9hcmVhKCkgKwogIGdlb21fbGluZShjb2wgPSAiYmxhY2siLCBwb3NpdGlvbiA9ICJzdGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKQpgYGAKCiog5Lit5Zu944Gv5Ymy5ZCI44GM5aSn44GN44GE44Gu44Gn55yB44GE44Gm44G/44KL44CCCgpgYGB7cn0KZGZfZ2RwICU+JSAKICBmaWx0ZXIocmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lIG11dGF0ZShnZHBfcmF0aW8gPSBnZHAvc3VtKGdkcCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKGlzbzJjICVpbiUgYygiSU4iLCAiUlUiLCAiQlIiLCAiWkEiKSkgICU+JQogIG11dGF0ZShpc28yY28gPSBmYWN0b3IoaXNvMmMsIGxldmVscyA9IGMoIlpBIiwgIkJSIiwgIlJVIiwgIklOIiwgIkNOIikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3JhdGlvLCBmaWxsID0gaXNvMmNvKSkgKyBnZW9tX2FyZWEoKSArCiAgZ2VvbV9saW5lKGNvbCA9ICJibGFjayIsIHBvc2l0aW9uID0gInN0YWNrIiwgbGluZXdpZHRoID0gMC4zKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpCmBgYAoKR0RQIOOBjOWkp+OBjeOBquWbveOBqOOAgeWwj+OBleOBquWbveOBjOOBguOCi+OBruOBr+OCj+OBi+OCiuOBvuOBmeOBjOOAgeOBneOCjOOBr+OAgeOBqeOBruOCiOOBhuOBq+WIhuW4g+OBl+OBpuOBhOOCi+OBruOBp+OBl+OCh+OBhuOBi+OAggoK44OS44K544OI44Kw44Op44Og44Gn6KaL44Gm44G/44G+44GX44KH44GG44CC44OS44K544OI44Kw44Op44Og44Gr44Gk44GE44Gm44Gv44CBUG9zaXQgUHJpbWVycyDjga7jgZPjgaHjgonjga5b44OT44OH44KqXShodHRwczovL3ZpbWVvLmNvbS8yMjE2MDczNDEp44GM44GK5Yun44KB44Gn44GZ44CCCgojIyMjIEZpZyA1LiAyMDIx5bm044Gu5LiW55WM44Gu5Zu944GuR0RQ44Gu5YiG5biD77yI77yR77yJCgoqKuS/ruato+OBl+OBpuOBguOCiuOBvuOBmeOAgioqCgpgYGB7cn0KZGZfZ2RwICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSBmaWx0ZXIocmVnaW9uICAhPSAiQWdncmVnYXRlcyIpICU+JQogIGdncGxvdChhZXMoZ2RwKSkgKyBnZW9tX2hpc3RvZ3JhbSgpCmBgYAoK5bCP44GV44GE44Go44GT44KN44Gr6ZuG5Lit44GX44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ44GM44CBYHNjYWxlX3hfbG9nMTAoKWAg44KS5Yqg44GI44CB5a++5pWw6Lu444KS44Go44Gj44Gm44G/44G+44GZ44CCCgokbG9nMTAoMTAwMCkgPSAzJCwgJGxvZzEwKDEwMDAwMDApID0gNiQsICRsb2cxMCgxMDAwMDAwMDAwKSA9IDkkIOOBquOBqeOBq+OBquOCiuOBvuOBmeOAggoKIyMjIyBGaWcgNi4gMjAyMeW5tOOBruS4lueVjOOBruWbveOBrkdEUOOBruWIhuW4g++8iO+8ku+8iQoKKirkv67mraPjgZfjgabjgYLjgorjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgZmlsdGVyKHJlZ2lvbiAgIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCkpICsgZ2VvbV9oaXN0b2dyYW0oKSArIHNjYWxlX3hfbG9nMTAoKQpgYGAKCuW5heOCkuWkieabtOOBl+OBn+OCiuOAgeWIhuOBkeOCi+WAi+aVsOOCkuWkieabtOOBmeOCi+OBq+OBryBgYmlud2lkdGggPSAwLjVgIOOChOOAgWBiaW5zID0gMjBgIOOCkuOAgWBnZW9tX2hpc3RvZ3JhbSgpYCDjga7jgYvjgaPjgZPjga7kuK3jgavlhaXjgozjgb7jgZnjgIIKCiMjIyMg57e057+SIDEtRmlnLjYKCi0gICBHRFAg44GM5bCP44GV44GE44Go44GT44KN44Gr6ZuG5Lit44GX44Gm44GE44KL44CCCgotICAgTG9nMTAg44K544Kx44O844Or44KS5L2/44GG44Go44CB44G/44KE44GZ44GP44Gq44KL44CCCgotICAg44GT44GT44Gn44Gv44CB5Zyw5Z+f44Gq44Gp44KC5ZCr44KB44Gm44GE44Gf44Gu44Gn44CB5LiK44Gn44Gv44CB5L+u5q2j44GX44Gm44GC44KK44G+44GZ44CCCgotICAgMeWFhuODieODq+OCkui2heOBiOOCi+WbveOBr+OAgemdnuW4uOOBq+WwkeOBquOBhOOBk+OBqOOBjOOCj+OBi+OCiuOBvuOBmeOAggoKIyMjIyDnt7Tnv5IgNgoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgZmlsdGVyKHJlZ2lvbiAgIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCkpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEyKSArIHNjYWxlX3hfbG9nMTAoKQpgYGAKCiMjIyMgRmlnIDcuIDIwMjHlubTjga7kuJbnlYzjga7lm73jga5HRFDjga7liIbluIPvvIjvvJPvvIkKCuOBvuOBn+OAgeWvhuW6puabsue3muOBq+WkieOBiOOCi+OBq+OBr+OAgWBnZW9tX2RlbnNpdHlgIOOCkuS9v+OBhOOBvuOBmeOAggoKKirkv67mraPjgZfjgabjgYLjgorjgb7jgZnjgIIqKgoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgZmlsdGVyKHJlZ2lvbiAgIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCkpICsgZ2VvbV9kZW5zaXR5KCkgKyBzY2FsZV94X2xvZzEwKCkKYGBgCgojIyMjIEZpZyA4LiAyMDIx5bm044Gu5LiW55WM44Gu5Zu944GuR0RQ44Gu5YiG5biD77yI77yU77yJCgrjgZPjgozjga/jgIEyMDIx5bm044Gu44OH44O844K/44Gn44GZ44GM44CBZGVuc2l0eSDjga7lpInljJbjgpLopovjgabjgb/jgb7jgZnjgIJhbHBoYSDjga7lgKTjga/pgI/mmI7luqbjgafjgZnjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAgJT4lIGZpbHRlcihyZWdpb24gICE9ICJBZ2dyZWdhdGVzIikgJT4lCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5NjEsIDE5NzEsIDE5ODEsIDE5OTEsIDIwMDEsIDIwMTEsIDIwMjEpKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC40KSArIHNjYWxlX3hfbG9nMTAoKQpgYGAKCiMjIyMgRmlnIDkuIDIwMjHlubTjga7kuJbnlYzjga7lm73jga5HRFDjga7liIbluIPvvIjvvJXvvIkKCuWwkeOBl+OBv+OBq+OBj+OBhOOBruOBp+OAgeWIhuOBkeOBpuOBv+OBvuOBmeOAggoKYGBge3J9CmRmX2dkcCAlPiUgZHJvcF9uYShnZHApICAlPiUgZmlsdGVyKHJlZ2lvbiAgIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBmaWx0ZXIoeWVhciAlaW4lIGMoMTk3MSwgMTk4MSwgMTk5MSwgMjAwMSwgMjAxMSwgMjAyMSkpICU+JQogIGdncGxvdChhZXMoZ2RwLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKyAKICBnZW9tX2RlbnNpdHkoKSArIHNjYWxlX3hfbG9nMTAoKSArIGZhY2V0X3dyYXAofnllYXIpCmBgYAoKKiDjgoLjgYblsJHjgZfjgIHlubTjga7mlbDjgpLmuJvjgonjgZfjgabjgb/jgovjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAgJT4lIGZpbHRlcihyZWdpb24gICE9ICJBZ2dyZWdhdGVzIikgJT4lCiAgZmlsdGVyKHllYXIgJWluJSBjKDE5NjEsIDE5OTEsIDIwMjEpKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC40KSArIHNjYWxlX3hfbG9nMTAoKQpgYGAKCuOBk+OCjOOBi+OCieOAgeimi+OBiOOBpuOBj+OCi+OBk+OBqOOCguOBguOCiuOBvuOBmeOBreOAggoKIyMjIyBGaWcgMTAuIOWcsOWfn+OBlOOBqOOBriBHRFAg44Gu5YiG5biDCgrjgYTjgY/jgaTjgYvjga7jgrDjg6vjg7zjg5fjgZTjgajjgavliIbluIPjgpLjgb/jgabjgb/jgovjgZPjgajjgoLlj6/og73jgafjgZnjgILjgZ3jgozjgavjga/jgIFCb3hwbG90IOOBjOacieWKueOBp+OBmeOAggoKQm94cGxvdCDjgavjgaTjgYTjgabjga/jgIFQb3NpdCBQcmltZXJzIOOBrlvjg5Pjg4fjgqpdKGh0dHBzOi8vdmltZW8uY29tLzIyMjM1ODAzNCnjgYzjgYrli6fjgoHjgafjgZnjgIIKCmBgYHtyfQpkZl9nZHAgJT4lIGRyb3BfbmEoZ2RwKSAlPiUgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JQogIGRyb3BfbmEocmVnaW9uKSAlPiUgZmlsdGVyKHllYXIgJWluJSBjKDIwMjEpKSAlPiUKICBnZ3Bsb3QoYWVzKGdkcCwgcmVnaW9uLCBmaWxsID0gcmVnaW9uKSkgKyAKICBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3hfbG9nMTAoKSArIGxhYnMoeSA9ICIiKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgojIyMjIOODoeODogoK57WM5bm05aSJ5YyW44KC6KaL44Gm44G/44KL44Go44CB6KaL44KE44GZ44GE44GL44Gp44GG44GL44Gv5Yil44Gn44GZ44GM44CCCgpgYGB7cn0KZGZfZ2RwICU+JSBkcm9wX25hKGdkcCkgJT4lIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBkcm9wX25hKHJlZ2lvbikgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTYxLCAxOTkxLCAyMDIxKSkgJT4lCiAgZ2dwbG90KGFlcyhyZWdpb24sIGdkcCwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV95X2xvZzEwKCkgKyBsYWJzKHggPSAiIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyaW5ncjo6c3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpCmBgYAoKIyMjIyBGaWcgMTEuIOWPjuWFpeOBruWkmuWvoeOBq+OCiOOCi+WIhumhnuOBlOOBqOOBriBHRFAg5YiG5biDCgpgYGB7cn0KZGZfZ2RwICU+JSBkcm9wX25hKGdkcCkgJT4lIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUKICBkcm9wX25hKGluY29tZSkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygyMDIxKSkgJT4lCiAgbXV0YXRlKGxldmVsID0gZmFjdG9yKGluY29tZSwgYygiSGlnaCBpbmNvbWUiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIsICJMb3dlciBtaWRkbGUgaW5jb21lIiwgIkxvdyBpbmNvbWUiKSkpICU+JQogIGdncGxvdChhZXMoZ2RwLCBsZXZlbCwgZmlsbCA9IGluY29tZSkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV94X2xvZzEwKCkgKyBsYWJzKHkgPSAiIikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoK44GT44KM44GL44KJ44KC44CB44GE44KN44GE44KN44Gq44GT44Go44GM44KP44GL44KK44G+44GZ44Gt44CCCgojIyMjIOS4lueVjOWcsOWbs+OBrua6luWCmQoK5Zyw5Zuz44Gn44CB5Zu944GuIGluY29tZSBsZXZlbCDjgpLjgb/jgabjgb/jgb7jgZfjgofjgYbjgIIKCioq5L+u5q2j44GX44Gm44GC44KK44G+44GZ44CCKioKCmBgYHtyIGNhY2hlPVRSVUV9CmxpYnJhcnkobWFwcykKZ2RwX3Nob3J0IDwtIGRmX2dkcCAlPiUgZmlsdGVyKHllYXIgPT0gMjAyMSwgcmVnaW9uICE9ICJBZ2dyZWdhdGVzIikgJT4lCiAgc2VsZWN0KGlzbzJjLCBnZHAsIGluY29tZSkKbWFwX3dvcmxkIDwtIG1hcF9kYXRhKCd3b3JsZCcpCm1hcF9nZHAgPC0gbWFwX3dvcmxkICU+JSAKICBtdXRhdGUoaXNvMmMgPSBpc28uYWxwaGEocmVnaW9uLCBuPTIpKSAlPiUgCiAgbGVmdF9qb2luKGdkcF9zaG9ydCwgYnkgPSAiaXNvMmMiKSAKaGVhZChtYXBfZ2RwKQpgYGAKCiMjIyMgRmlnIDEyLiBJbmNvbWUgTGV2ZWwg44Gr44KI44KL6Imy5YiG44GR5Zyw5ZuzCgoqKuS/ruato+OBl+OBpuOBguOCiuOBvuOBmeOAgioqCgpgYGB7ciBjYWNoZSA9IFRSVUV9Cm1hcF9nZHAgJT4lIG11dGF0ZShpbmNvbWVfbGV2ZWwgPSBmYWN0b3IoaW5jb21lLCBsZXZlbHMgPSBjKCJIaWdoIGluY29tZSIsICJVcHBlciBtaWRkbGUgaW5jb21lIiwgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCAiTG93IGluY29tZSIsICJOb3QgY2xhc3NpZmllZCIsIE5BKSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX21hcChhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24sIGZpbGwgPSBpbmNvbWVfbGV2ZWwpLCBtYXAgPSBtYXBfd29ybGQsIGNvbCA9ICJibGFjayIsIHNpemUgPSAwLjEpIApgYGAKCiMjIyMgRmlnIDEzLiBHRFAg44Gr44KI44KL6Imy5YiG44GR5Zyw5ZuzCgoqKuS/ruato+OBl+OBpuOBguOCiuOBvuOBmeOAgioqCgpgYGB7ciBjYWNoZSA9IFRSVUV9Cm1hcF9nZHAgJT4lIG11dGF0ZShpbmNvbWVfbGV2ZWwgPSBmYWN0b3IoaW5jb21lLCBsZXZlbHMgPSBjKCJIaWdoIGluY29tZSIsICJVcHBlciBtaWRkbGUgaW5jb21lIiwgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCAiTG93IGluY29tZSIsICJOb3QgY2xhc3NpZmllZCIsIE5BKSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX21hcChhZXMoeD1sb25nLCB5PWxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gZ2RwKSwgbWFwID0gbWFwX3dvcmxkLCBjb2wgPSAiYmxhY2siLCBzaXplID0gMC4xKSAKYGBgCgojIyMjIOe3tOe/kiA3CgoxOTgw5bm044Gr5aSJ5pu044GX44Gm44G/44G+44GX44KH44GG44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpsaWJyYXJ5KG1hcHMpCmdkcF9zaG9ydCA8LSBkZl9nZHAgJT4lIGZpbHRlcih5ZWFyID09IDE5ODAsIHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpICU+JQogIHNlbGVjdChpc28yYywgZ2RwLCBpbmNvbWUpCm1hcF93b3JsZCA8LSBtYXBfZGF0YSgnd29ybGQnKQptYXBfZ2RwIDwtIG1hcF93b3JsZCAlPiUgCiAgbXV0YXRlKGlzbzJjID0gaXNvLmFscGhhKHJlZ2lvbiwgbj0yKSkgJT4lIAogIGxlZnRfam9pbihnZHBfc2hvcnQsIGJ5ID0gImlzbzJjIikgCmhlYWQobWFwX2dkcCkKYGBgCgojIyMjIEZpZyAxMi4gSW5jb21lIExldmVsIOOBq+OCiOOCi+iJsuWIhuOBkeWcsOWbsyAtIDE5ODAKCuWkieWMluOBr+OBguOCiuOBvuOBmeOBi+OAgueEoeOBhOOCiOOBhuOBp+OBmeOBreOAggoKYGBge3IgY2FjaGUgPSBUUlVFfQptYXBfZ2RwICU+JSBtdXRhdGUoaW5jb21lX2xldmVsID0gZmFjdG9yKGluY29tZSwgbGV2ZWxzID0gYygiSGlnaCBpbmNvbWUiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIsICJMb3dlciBtaWRkbGUgaW5jb21lIiwgIkxvdyBpbmNvbWUiLCAiTm90IGNsYXNzaWZpZWQiLCBOQSkpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gaW5jb21lX2xldmVsKSwgbWFwID0gbWFwX3dvcmxkLCBjb2wgPSAiYmxhY2siLCBzaXplID0gMC4xKSAKYGBgCgojIyMjIEZpZyAxMy4gR0RQIOOBq+OCiOOCi+iJsuWIhuOBkeWcsOWbsyAtIDE5ODAKCuOBk+OBoeOCieOBr+OAgeWkieWMluOBjOOBguOCiuOBvuOBmeOAguOCueOCseODvOODq+OCguWkieOCj+OBo+OBpuOBhOOBvuOBmeOAggoKYGBge3IgY2FjaGUgPSBUUlVFfQptYXBfZ2RwICU+JSBtdXRhdGUoaW5jb21lX2xldmVsID0gZmFjdG9yKGluY29tZSwgbGV2ZWxzID0gYygiSGlnaCBpbmNvbWUiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIsICJMb3dlciBtaWRkbGUgaW5jb21lIiwgIkxvdyBpbmNvbWUiLCAiTm90IGNsYXNzaWZpZWQiLCBOQSkpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoYWVzKHg9bG9uZywgeT1sYXQsIG1hcF9pZCA9IHJlZ2lvbiwgZmlsbCA9IGdkcCksIG1hcCA9IG1hcF93b3JsZCwgY29sID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgCmBgYAoKYGBge3J9CmRmX2dkcCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkNoaW5hIikgJT4lIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCBnZHAsIGluY29tZSkgJT4lIGFycmFuZ2UoeWVhcikKYGBgCgojIyMjIOODoeODogoK5Zyw5Zuz44Gv44CB44GZ44GT44GX44CB6Zuj44GX44GE44Gn44GZ44GM44CB6YCa5bi444Gu44Kw44Op44OV44Go44Gv6YGV44GG5oOF5aCx44KC5b6X44KJ44KM44G+44GZ44CC5pyA6L+R44Gv44CB44GV44G+44GW44G+44Gq5Zyw5Zuz44GM5L2/44GI44KL44KI44GG44Gr44Gq44Gj44Gm44GK44KK44CB5L6L44GI44Gw44CB5pel5pys44Gu6KGM5pS/5Yy65Z+f44Gu5ZCN56ew44Gr5a++5b+c44GV44Gb44KL44Go44CB55yM5Yil44KE44CB5biC55S65p2R5Yil44Gq44Gp44Gu5Zyw5Zuz44KC44CB5L2/44GG44GT44Go44GM5Y+v6IO944Gn44GZ44CCCgojIyDnt7Tnv5IKCjEuICDjgZ3jgozjgZ7jgozjga7jgrDjg6njg5XjgYvjgonjgIHjgo/jgYvjgaPjgZ/jgZPjgajjgIHllY/jgYTjgarjganjgpLliJfmjJnjgZfjgabjgb/jgb7jgZfjgofjgYbjgIIKMi4gIEZpZyAxIOOBruOAgEphcGFuIOOBrumDqOWIhuOCkuS7luOBruWbveOChOOAgeOCsOODq+ODvOODl++8iFdvcmxkIOOBquOBqe+8ieOBq+WkieOBiOOBpuOBv+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggozLiAgRmlnIDMg44GuIGlzbzJjIOOBp+mBuOaKnuOBmeOCi+OAgeWbveOCkuWkieabtOOBl+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggo0LiAgRmlnIDQg44G+44Gf44GvIEZpZyA1IOOBriBpc28yYyDjga7pg6jliIbjgpLku5bjga7lm73jgavlpInmm7TjgZfjgabjgY/jgaDjgZXjgYTjgILkvZXjgYzjgo/jgYvjgorjgb7jgZnjgYvjgIIKNS4gIEZpZyA1IOOBvuOBn+OBryBGaWcgNiDjga7jgIHljLrplpPjga7luYXjgoTjgIHmlbDjgpIg5aSJ5pu044GX44Gm44G/44Gm44GP44Gg44GV44GE44CC5L2V44GM44KP44GL44KK44G+44GZ44GL44CCCjYuICBGaWcgNywgRmlnIDgsIEZpZyA5IOOBruW5tOOCkuWkieabtOOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAguS9leOBjOOCj+OBi+OCiuOBvuOBmeOBi+OAggo3LiAgRmlnIDEyLCBGaWcgMTMg44Gu5bm044KS5aSJ5pu044GX44Gm44G/44Gm44GP44Gg44GV44GE44CC5L2V44GM44KP44GL44KK44G+44GZ44GL44CCCgojIyDjgb7jgajjgoEKCuS7iuWbnuOBr+OAgee1jOa4iOaMh+aomeOBp+OBguOCi+OAgUdEUCDjgpLkvb/jgYTjgb7jgZfjgZ/jgILjg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrnjgavjgaTjgYTjgablsJHjgZfjgZrjgaTjgIHlrabjgpPjgafjgYTjgY3jgb7jgZnjgIIKCuOCs+ODvOODieOBruiqrOaYjuOBr+OAgeewoeWNmOOBq+OBl+OBi+OBl+OBpuOBhOOBvuOBm+OCk+OBi+OCieOAgeeQhuino+OBmeOCi+OBruOBr+mbo+OBl+OBhOOBqOaAneOBhOOBvuOBmeOBjOOAgeOBhOOBj+OBpOOBi+OBruOBk+OBqOOBr+OAgeOBlOeQhuino+OBhOOBn+OBoOOBkeOCi+OBqOaAneOBhOOBvuOBmeOAggoKLSAgIOOBneOCjOOBu+OBqeOAgemVt+OBj+OBr+OBquOBhOOAgeOCs+ODvOODieOBp+OAgeODh+ODvOOCv+OCkuimi+OBpuOBhOOBj+OAglIg44Gv5a++6Kmx5Z6L77yIaW50ZXJhY3RpdmXvvInjga7jg5fjg63jgrDjg6njg5/jg7PjgrDoqIDoqp7jgajoqIDjgo/jgozjgabjgYTjgb7jgZnjgIIKCi0gICDjgrPjg7zjg4njgavntprjgZHjgabjgIHntZDmnpzjgYzooajnpLrjgZXjgozjgovjga7jgafjgIHjgrPjg7zjg4njgajlh7rlipvjga7lr77lv5zjgYzopovjgoTjgZnjgYTjgILjgb7jgZ/jgIHjgrPjg6Hjg7Pjg4jjgoToqqzmmI7jgoLkvbXoqJjjgZnjgovjgZPjgajjgYzjgafjgY3jgovjgILjgZPjgozjga/jgIFSTWFya2Rvd24g44Go44GE44GG5b2i5byP44Gu5Lit44Gn44CB44Kz44O844OJ44KS5pu444GE44Gm44GE44KL44GT44Go44Gr44KI44KL44KC44Gu44Gn44GZ44CCUk1hcmtkb3duIOOBr+OAgeWGjeePvuaAp++8iHJlcHJvZHVjaWJpbGl0ee+8ieOBqOOAgeODl+ODreOCsOODqeODoOODu+OCs+ODvOODieOBruWGheWuueOCkuOCs+ODs+ODlOODpeODvOOCv+OBq+OCj+OBi+OCi+OCiOOBhuOBq+OBp+OBquOBj+OAgeS6uumWk+OBq+OCguOCj+OBi+OCi+OCiOOBhuOBq+iomOi/sOOBmeOCi++8iExpdGVyYXRlIFByb2dyYW1taW5n77yJ44KS5a6f54++44GX44Gm44GE44G+44GZ44CCCgotICAg6KaW6Kaa5YyW77yIVmlzdWFsaXphdGlvbu+8ieOBq+OCiOOBo+OBpuOAgeOCj+OBi+OCi+OBk+OBqOOBjOiJsuOAheOBqOOBguOCi+OAguOBvuOBn+OAgeimluimmuWMluOBruaWueazleOCguOBn+OBj+OBleOCk+OBguOCiuOAgeOBhOOCjeOBhOOCjeOBquimi+aWueOCkuOBmeOCi+OBk+OBqOOBp+OAgeODh+ODvOOCv+OBq+OBpOOBhOOBpuOBrueQhuino+OBjOa3seOBvuOBo+OBpuOBhOOBj+OAggoKLSAgIOimluimmuWMluOCkumAmuOBl+OBpuOAgeODh+ODvOOCv+OCkueQhuino+OBmeOCi+OBk+OBqOOAgeWVj+OBhOOCkuaMgeOBoeOAgeS7luOBruimluimmuWMluOBquOBqeOCkueUqOOBhOOBpuOAgeOBleOCieOBq+OAgeeQhuino+OCkua3seOCgeOCi+OBk+OBqOOBjOOBn+OBhOOBm+OBpOOAggoKLSAgIOeQhuino+OBl+OBn+OBk+OBqOOCkuWFg+OBq+OBl+OBpuOAgeOBleOCieOBq+OAgeOBneOBruODh+ODvOOCv+OAgeOBvuOBn+OBr+OAgeS7luOBruODh+ODvOOCv+OCkuS9v+OBo+OBpuOAgeaWsOOBn+OBqueZuuimi+OCkuOBl+OBpuOBhOOBj+OAggoK57Wx6KiI55qE44Gq5oyH5qiZ44KC55So44GE44G+44GZ44GM44CB44Gd44KM44KJ44Gr44KI44Gj44Gm44CB5paw44GX44GE55+l6K2Y44KS55Sf44G/5Ye644GZ44Go44KC6KGo54++44GX44G+44GZ44GM44CB44Gd44Gu44KI44GG44Gq5Za244G/5YWo5L2T44GM44CB44OH44O844K/44K144Kk44Ko44Oz44K544Gu5qC444KS44Gq44GZ6YOo5YiG44Gg44Go5oCd44GE44G+44GZ44CCCg==